[edk2] [Patch 1/2] MdePkg: Add new definitions for Management Mode.

Eric Dong posted 2 patches 7 years, 4 months ago
There is a newer version of this series
[edk2] [Patch 1/2] MdePkg: Add new definitions for Management Mode.
Posted by Eric Dong 7 years, 4 months ago
In PI 1.5 version, system management mode name(SMM) has been changed
to Management Mode(MM). It impacts the current code which still use
SMM/Smram/SMI keywords. This patch add new definition which use
MM/MmRam/MMI keywords to follow new spec definitions.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
---
 MdePkg/Include/Pi/PiMmCis.h                        | 350 +++++++++++++++++++++
 MdePkg/Include/PiMm.h                              |  25 ++
 MdePkg/Include/Protocol/DxeMmReadyToLock.h         |  41 +++
 MdePkg/Include/Protocol/MmAccess.h                 | 133 ++++++++
 MdePkg/Include/Protocol/MmBase.h                   |  87 +++++
 MdePkg/Include/Protocol/MmCommunication.h          |  83 +++++
 MdePkg/Include/Protocol/MmConfiguration.h          |  86 +++++
 MdePkg/Include/Protocol/MmControl.h                | 106 +++++++
 MdePkg/Include/Protocol/MmCpu.h                    | 247 +++++++++++++++
 MdePkg/Include/Protocol/MmCpuIo.h                  |  96 ++++++
 MdePkg/Include/Protocol/MmEndOfDxe.h               |  33 ++
 MdePkg/Include/Protocol/MmGpiDispatch.h            | 125 ++++++++
 MdePkg/Include/Protocol/MmIoTrapDispatch.h         | 136 ++++++++
 MdePkg/Include/Protocol/MmPciRootBridgeIo.h        |  37 +++
 MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h  | 170 ++++++++++
 MdePkg/Include/Protocol/MmPowerButtonDispatch.h    | 117 +++++++
 MdePkg/Include/Protocol/MmReadyToLock.h            |  35 +++
 .../Include/Protocol/MmReportStatusCodeHandler.h   |  81 +++++
 MdePkg/Include/Protocol/MmStandbyButtonDispatch.h  | 119 +++++++
 MdePkg/Include/Protocol/MmStatusCode.h             |  65 ++++
 MdePkg/Include/Protocol/MmSwDispatch.h             | 136 ++++++++
 MdePkg/Include/Protocol/MmSxDispatch.h             | 135 ++++++++
 MdePkg/Include/Protocol/MmUsbDispatch.h            | 130 ++++++++
 MdePkg/MdePkg.dec                                  |  63 ++++
 24 files changed, 2636 insertions(+)
 create mode 100644 MdePkg/Include/Pi/PiMmCis.h
 create mode 100644 MdePkg/Include/PiMm.h
 create mode 100644 MdePkg/Include/Protocol/DxeMmReadyToLock.h
 create mode 100644 MdePkg/Include/Protocol/MmAccess.h
 create mode 100644 MdePkg/Include/Protocol/MmBase.h
 create mode 100644 MdePkg/Include/Protocol/MmCommunication.h
 create mode 100644 MdePkg/Include/Protocol/MmConfiguration.h
 create mode 100644 MdePkg/Include/Protocol/MmControl.h
 create mode 100644 MdePkg/Include/Protocol/MmCpu.h
 create mode 100644 MdePkg/Include/Protocol/MmCpuIo.h
 create mode 100644 MdePkg/Include/Protocol/MmEndOfDxe.h
 create mode 100644 MdePkg/Include/Protocol/MmGpiDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmIoTrapDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmPciRootBridgeIo.h
 create mode 100644 MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmPowerButtonDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmReadyToLock.h
 create mode 100644 MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
 create mode 100644 MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmStatusCode.h
 create mode 100644 MdePkg/Include/Protocol/MmSwDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmSxDispatch.h
 create mode 100644 MdePkg/Include/Protocol/MmUsbDispatch.h

diff --git a/MdePkg/Include/Pi/PiMmCis.h b/MdePkg/Include/Pi/PiMmCis.h
new file mode 100644
index 0000000..6f41fa9
--- /dev/null
+++ b/MdePkg/Include/Pi/PiMmCis.h
@@ -0,0 +1,350 @@
+/** @file
+  Common definitions in the Platform Initialization Specification version 1.6
+  VOLUME 4 Management Mode Core Interface version.
+
+  Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _PI_MMCIS_H_
+#define _PI_MMCIS_H_
+
+#include <Protocol/MmCpuIo.h>
+
+typedef struct _EFI_MM_SYSTEM_TABLE  EFI_MM_SYSTEM_TABLE;
+
+///
+/// The Management Mode System Table (MMST) signature
+///
+#define MM_MMST_SIGNATURE            SIGNATURE_32 ('S', 'M', 'S', 'T')
+///
+/// The Management Mode System Table (MMST) revision is 1.6
+///
+#define MM_SPECIFICATION_MAJOR_REVISION  1
+#define MM_SPECIFICATION_MINOR_REVISION  60
+#define EFI_MM_SYSTEM_TABLE_REVISION    ((MM_SPECIFICATION_MAJOR_REVISION<<16) | (MM_SPECIFICATION_MINOR_REVISION))
+
+/**
+  Adds, updates, or removes a configuration table entry from the Management Mode System Table.
+
+  The MmInstallConfigurationTable() function is used to maintain the list
+  of configuration tables that are stored in the Management Mode System
+  Table.  The list is stored as an array of (GUID, Pointer) pairs.  The list
+  must be allocated from pool memory with PoolType set to EfiRuntimeServicesData.
+
+  @param[in] SystemTable         A pointer to the MM System Table (MMST).
+  @param[in] Guid                A pointer to the GUID for the entry to add, update, or remove.
+  @param[in] Table               A pointer to the buffer of the table to add.
+  @param[in] TableSize           The size of the table to install.
+
+  @retval EFI_SUCCESS            The (Guid, Table) pair was added, updated, or removed.
+  @retval EFI_INVALID_PARAMETER  Guid is not valid.
+  @retval EFI_NOT_FOUND          An attempt was made to delete a non-existent entry.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory available to complete the operation.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_INSTALL_CONFIGURATION_TABLE)(
+  IN CONST EFI_MM_SYSTEM_TABLE    *SystemTable,
+  IN CONST EFI_GUID               *Guid,
+  IN VOID                         *Table,
+  IN UINTN                        TableSize
+  );
+
+/**
+  This service lets the caller to get one distinct application processor (AP) to execute
+  a caller-provided code stream while in MM.
+
+  @param[in]     Procedure       A pointer to the code stream to be run on the designated
+                                 AP of the system.
+  @param[in]     CpuNumber       The zero-based index of the processor number of the AP
+                                 on which the code stream is supposed to run.
+  @param[in,out] ProcArguments   Allows the caller to pass a list of parameters to the code
+                                 that is run by the AP.
+
+  @retval EFI_SUCCESS            The call was successful and the return parameters are valid.
+  @retval EFI_INVALID_PARAMETER  The input arguments are out of range.
+  @retval EFI_INVALID_PARAMETER  The CPU requested is not available on this SMI invocation.
+  @retval EFI_INVALID_PARAMETER  The CPU cannot support an additional service invocation.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_STARTUP_THIS_AP)(
+  IN EFI_AP_PROCEDURE  Procedure,
+  IN UINTN             CpuNumber,
+  IN OUT VOID          *ProcArguments OPTIONAL
+  );
+
+/**
+  Function prototype for protocol install notification.
+
+  @param[in] Protocol   Points to the protocol's unique identifier.
+  @param[in] Interface  Points to the interface instance.
+  @param[in] Handle     The handle on which the interface was installed.
+
+  @return Status Code
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_NOTIFY_FN)(
+  IN CONST EFI_GUID  *Protocol,
+  IN VOID            *Interface,
+  IN EFI_HANDLE      Handle
+  );
+
+/**
+  Register a callback function be called when a particular protocol interface is installed.
+
+  The MmRegisterProtocolNotify() function creates a registration Function that is to be 
+  called whenever a protocol interface is installed for Protocol by 
+  MmInstallProtocolInterface().
+  If Function == NULL and Registration is an existing registration, then the callback is unhooked.
+
+  @param[in]  Protocol          The unique ID of the protocol for which the event is to be registered.
+  @param[in]  Function          Points to the notification function.
+  @param[out] Registration      A pointer to a memory location to receive the registration value.
+
+  @retval EFI_SUCCESS           Successfully returned the registration record
+                                that has been added or unhooked.
+  @retval EFI_INVALID_PARAMETER Protocol is NULL or Registration is NULL.
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory resource to finish the request.
+  @retval EFI_NOT_FOUND         If the registration is not found when Function == NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_REGISTER_PROTOCOL_NOTIFY)(
+  IN  CONST EFI_GUID     *Protocol,
+  IN  EFI_MM_NOTIFY_FN   Function,
+  OUT VOID               **Registration
+  );
+
+/**
+  Manage MMI of a particular type.
+
+  @param[in]     HandlerType     Points to the handler type or NULL for root MMI handlers.
+  @param[in]     Context         Points to an optional context buffer.
+  @param[in,out] CommBuffer      Points to the optional communication buffer.
+  @param[in,out] CommBufferSize  Points to the size of the optional communication buffer.
+
+  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING  Interrupt source was processed successfully but not quiesced.
+  @retval EFI_INTERRUPT_PENDING              One or more SMI sources could not be quiesced.
+  @retval EFI_NOT_FOUND                      Interrupt source was not handled or quiesced.
+  @retval EFI_SUCCESS                        Interrupt source was handled and quiesced.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_INTERRUPT_MANAGE)(
+  IN CONST EFI_GUID  *HandlerType,
+  IN CONST VOID      *Context         OPTIONAL,
+  IN OUT VOID        *CommBuffer      OPTIONAL,
+  IN OUT UINTN       *CommBufferSize  OPTIONAL
+  );
+
+/**
+  Main entry point for an MM handler dispatch or communicate-based callback.
+
+  @param[in]     DispatchHandle  The unique handle assigned to this handler by MmiHandlerRegister().
+  @param[in]     Context         Points to an optional handler context which was specified when the
+                                 handler was registered.
+  @param[in,out] CommBuffer      A pointer to a collection of data in memory that will
+                                 be conveyed from a non-MM environment into an MM environment.
+  @param[in,out] CommBufferSize  The size of the CommBuffer.
+
+  @retval EFI_SUCCESS                         The interrupt was handled and quiesced. No other handlers 
+                                              should still be called.
+  @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED  The interrupt has been quiesced but other handlers should 
+                                              still be called.
+  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING   The interrupt is still pending and other handlers should still 
+                                              be called.
+  @retval EFI_INTERRUPT_PENDING               The interrupt could not be quiesced.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_HANDLER_ENTRY_POINT)(
+  IN EFI_HANDLE  DispatchHandle,
+  IN CONST VOID  *Context         OPTIONAL,
+  IN OUT VOID    *CommBuffer      OPTIONAL,
+  IN OUT UINTN   *CommBufferSize  OPTIONAL
+  );
+
+/**
+  Registers a handler to execute within MM.
+
+  @param[in]  Handler            Handler service function pointer.
+  @param[in]  HandlerType        Points to the handler type or NULL for root MMI handlers.
+  @param[out] DispatchHandle     On return, contains a unique handle which can be used to later
+                                 unregister the handler function.
+
+  @retval EFI_SUCCESS            MMI handler added successfully.
+  @retval EFI_INVALID_PARAMETER  Handler is NULL or DispatchHandle is NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_INTERRUPT_REGISTER)(
+  IN  EFI_MM_HANDLER_ENTRY_POINT    Handler,
+  IN  CONST EFI_GUID                *HandlerType OPTIONAL,
+  OUT EFI_HANDLE                    *DispatchHandle
+  );
+
+/**
+  Unregister a handler in MM.
+
+  @param[in] DispatchHandle      The handle that was specified when the handler was registered.
+
+  @retval EFI_SUCCESS            Handler function was successfully unregistered.
+  @retval EFI_INVALID_PARAMETER  DispatchHandle does not refer to a valid handle.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_INTERRUPT_UNREGISTER)(
+  IN EFI_HANDLE  DispatchHandle
+  );
+
+///
+/// Processor information and functionality needed by MM Foundation.
+///
+typedef struct _EFI_MM_ENTRY_CONTEXT {
+  EFI_MM_STARTUP_THIS_AP   MmStartupThisAp;
+  ///
+  /// A number between zero and the NumberOfCpus field. This field designates which 
+  /// processor is executing the SMM Foundation.
+  ///
+  UINTN                    CurrentlyExecutingCpu;
+  ///
+  /// The number of possible processors in the platform.  This is a 1 based 
+  /// counter.  This does not indicate the number of processors that entered SMM.
+  ///
+  UINTN                    NumberOfCpus;
+  ///
+  /// Points to an array, where each element describes the number of bytes in the 
+  /// corresponding save state specified by CpuSaveState. There are always 
+  /// NumberOfCpus entries in the array. 
+  ///
+  UINTN                    *CpuSaveStateSize;
+  ///
+  /// Points to an array, where each element is a pointer to a CPU save state. The 
+  /// corresponding element in CpuSaveStateSize specifies the number of bytes in the 
+  /// save state area. There are always NumberOfCpus entries in the array.
+  ///
+  VOID                     **CpuSaveState;
+} EFI_MM_ENTRY_CONTEXT;
+
+/**
+  This function is the main entry point to the MM Foundation.
+
+  @param[in] MmEntryContext  Processor information and functionality needed by MM Foundation.
+**/
+typedef
+VOID
+(EFIAPI *EFI_MM_ENTRY_POINT)(
+  IN CONST EFI_MM_ENTRY_CONTEXT  *MmEntryContext
+  );
+
+///
+/// Management Mode System Table (MMST)
+///
+/// The Management Mode System Table (MMST) is a table that contains a collection of common 
+/// services for managing MMRAM allocation and providing basic I/O services. These services are 
+/// intended for both preboot and runtime usage.
+///
+struct _EFI_MM_SYSTEM_TABLE {
+  ///
+  /// The table header for the SMST.
+  ///
+  EFI_TABLE_HEADER                     Hdr;
+  ///
+  /// A pointer to a NULL-terminated Unicode string containing the vendor name.
+  /// It is permissible for this pointer to be NULL.
+  ///
+  CHAR16                               *MmFirmwareVendor;
+  ///
+  /// The particular revision of the firmware.
+  ///
+  UINT32                               MmFirmwareRevision;
+
+  EFI_MM_INSTALL_CONFIGURATION_TABLE   MmInstallConfigurationTable;
+
+  ///
+  /// I/O Service
+  ///
+  EFI_MM_CPU_IO_PROTOCOL               MmIo;
+
+  ///
+  /// Runtime memory services
+  ///
+  EFI_ALLOCATE_POOL                    MmAllocatePool;
+  EFI_FREE_POOL                        MmFreePool;
+  EFI_ALLOCATE_PAGES                   MmAllocatePages;
+  EFI_FREE_PAGES                       MmFreePages;
+
+  ///
+  /// MP service
+  ///
+  EFI_MM_STARTUP_THIS_AP               MmStartupThisAp;
+
+  ///
+  /// CPU information records
+  ///
+
+  ///
+  /// A number between zero and and the NumberOfCpus field. This field designates 
+  /// which processor is executing the SMM infrastructure.
+  ///
+  UINTN                                CurrentlyExecutingCpu;
+  ///
+  /// The number of possible processors in the platform.  This is a 1 based counter.
+  ///
+  UINTN                                NumberOfCpus;
+  ///
+  /// Points to an array, where each element describes the number of bytes in the 
+  /// corresponding save state specified by CpuSaveState. There are always 
+  /// NumberOfCpus entries in the array. 
+  ///
+  UINTN                                *CpuSaveStateSize;
+  ///
+  /// Points to an array, where each element is a pointer to a CPU save state. The 
+  /// corresponding element in CpuSaveStateSize specifies the number of bytes in the 
+  /// save state area. There are always NumberOfCpus entries in the array.
+  ///
+  VOID                                 **CpuSaveState;
+
+  ///
+  /// Extensibility table
+  ///
+
+  ///
+  /// The number of UEFI Configuration Tables in the buffer SmmConfigurationTable.
+  ///
+  UINTN                                NumberOfTableEntries;
+  ///
+  /// A pointer to the UEFI Configuration Tables. The number of entries in the table is 
+  /// NumberOfTableEntries. 
+  ///
+  EFI_CONFIGURATION_TABLE              *MmConfigurationTable;
+
+  ///
+  /// Protocol services
+  ///
+  EFI_INSTALL_PROTOCOL_INTERFACE       MmInstallProtocolInterface;
+  EFI_UNINSTALL_PROTOCOL_INTERFACE     MmUninstallProtocolInterface;
+  EFI_HANDLE_PROTOCOL                  MmHandleProtocol;
+  EFI_MM_REGISTER_PROTOCOL_NOTIFY      MmRegisterProtocolNotify;
+  EFI_LOCATE_HANDLE                    MmLocateHandle;
+  EFI_LOCATE_PROTOCOL                  MmLocateProtocol;
+
+  ///
+  /// MMI Management functions
+  ///
+  EFI_MM_INTERRUPT_MANAGE              MmiManage;
+  EFI_MM_INTERRUPT_REGISTER            MmiHandlerRegister;
+  EFI_MM_INTERRUPT_UNREGISTER          MmiHandlerUnRegister;
+};
+
+#endif
diff --git a/MdePkg/Include/PiMm.h b/MdePkg/Include/PiMm.h
new file mode 100644
index 0000000..fdb7d27
--- /dev/null
+++ b/MdePkg/Include/PiMm.h
@@ -0,0 +1,25 @@
+/** @file
+
+  Root include file for Mde Package MM modules.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under 
+the terms and conditions of the BSD License that accompanies this distribution.  
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.                                          
+    
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __PI_MM_H__
+#define __PI_MM_H__
+
+#include <Uefi/UefiBaseType.h>
+#include <Uefi/UefiSpec.h>
+
+#include <Pi/PiMmCis.h>
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/DxeMmReadyToLock.h b/MdePkg/Include/Protocol/DxeMmReadyToLock.h
new file mode 100644
index 0000000..9101101
--- /dev/null
+++ b/MdePkg/Include/Protocol/DxeMmReadyToLock.h
@@ -0,0 +1,41 @@
+/** @file
+  DXE MM Ready To Lock protocol introduced in the PI 1.2 specification.
+
+  According to PI 1.4a specification, this UEFI protocol indicates that
+  resources and services that should not be used by the third party code
+  are about to be locked.
+  This protocol is a mandatory protocol published by PI platform code.
+  This protocol in tandem with the End of DXE Event facilitates transition
+  of the platform from the environment where all of the components are
+  under the authority of the platform manufacturer to the environment where
+  third party extensible modules such as UEFI drivers and UEFI applications
+  are executed. The protocol is published immediately after signaling of the
+  End of DXE Event. PI modules that need to lock or protect their resources
+  in anticipation of the invocation of 3rd party extensible modules should
+  register for notification on installation of this protocol and effect the
+  appropriate protections in their notification handlers. For example, PI
+  platform code may choose to use notification handler to lock MM by invoking
+  EFI_MM_ACCESS_PROTOCOL.Lock() function.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _DXE_MM_READY_TO_LOCK_H_
+#define _DXE_MM_READY_TO_LOCK_H_
+
+#define EFI_DXE_MM_READY_TO_LOCK_PROTOCOL_GUID \
+  { \
+    0x60ff8964, 0xe906, 0x41d0, { 0xaf, 0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0, 0x8e } \
+  }
+
+extern EFI_GUID gEfiDxeMmReadyToLockProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmAccess.h b/MdePkg/Include/Protocol/MmAccess.h
new file mode 100644
index 0000000..b59c798
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmAccess.h
@@ -0,0 +1,133 @@
+/** @file
+  EFI MM Access Protocol as defined in the PI 1.2 specification.
+
+  This protocol is used to control the visibility of the MMRAM on the platform.
+  It abstracts the location and characteristics of MMRAM.  The expectation is
+  that the north bridge or memory controller would publish this protocol.
+
+  The principal functionality found in the memory controller includes the following: 
+  - Exposing the MMRAM to all non-MM agents, or the "open" state
+  - Shrouding the MMRAM to all but the MM agents, or the "closed" state
+  - Preserving the system integrity, or "locking" the MMRAM, such that the settings cannot be 
+    perturbed by either boot service or runtime agents 
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_ACCESS_H_
+#define _MM_ACCESS_H_
+
+#define EFI_MM_ACCESS_PROTOCOL_GUID \
+  { \
+     0xc2702b74, 0x800c, 0x4131, {0x87, 0x46, 0x8f, 0xb5, 0xb8, 0x9c, 0xe4, 0xac } \
+  }
+
+
+typedef struct _EFI_MM_ACCESS_PROTOCOL  EFI_MM_ACCESS_PROTOCOL;
+
+/**
+  Opens the MMRAM area to be accessible by a boot-service driver.
+
+  This function "opens" MMRAM so that it is visible while not inside of MM. The function should 
+  return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM. The function 
+  should return EFI_DEVICE_ERROR if the MMRAM configuration is locked.
+
+  @param[in] This           The EFI_MM_ACCESS_PROTOCOL instance.
+
+  @retval EFI_SUCCESS       The operation was successful.
+  @retval EFI_UNSUPPORTED   The system does not support opening and closing of MMRAM.
+  @retval EFI_DEVICE_ERROR  MMRAM cannot be opened, perhaps because it is locked.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_OPEN)(
+  IN EFI_MM_ACCESS_PROTOCOL  *This
+  );
+
+/**
+  Inhibits access to the MMRAM.
+
+  This function "closes" MMRAM so that it is not visible while outside of MM. The function should 
+  return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM.
+
+  @param[in] This           The EFI_MM_ACCESS_PROTOCOL instance.
+
+  @retval EFI_SUCCESS       The operation was successful.
+  @retval EFI_UNSUPPORTED   The system does not support opening and closing of MMRAM.
+  @retval EFI_DEVICE_ERROR  MMRAM cannot be closed.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_CLOSE)(
+  IN EFI_MM_ACCESS_PROTOCOL  *This
+  );
+
+/**
+  Inhibits access to the MMRAM.
+
+  This function prohibits access to the MMRAM region.  This function is usually implemented such 
+  that it is a write-once operation. 
+
+  @param[in] This          The EFI_MM_ACCESS_PROTOCOL instance.
+
+  @retval EFI_SUCCESS      The device was successfully locked.
+  @retval EFI_UNSUPPORTED  The system does not support locking of MMRAM.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_LOCK)(
+  IN EFI_MM_ACCESS_PROTOCOL  *This
+  );
+
+/**
+  Queries the memory controller for the possible regions that will support MMRAM.
+
+  @param[in]     This           The EFI_MM_ACCESS_PROTOCOL instance.
+  @param[in,out] MmramMapSize   A pointer to the size, in bytes, of the MmramMemoryMap buffer.
+  @param[in,out] MmramMap       A pointer to the buffer in which firmware places the current memory map.
+
+  @retval EFI_SUCCESS           The chipset supported the given resource.
+  @retval EFI_BUFFER_TOO_SMALL  The MmramMap parameter was too small.  The current buffer size 
+                                needed to hold the memory map is returned in MmramMapSize.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_CAPABILITIES)(
+  IN CONST EFI_MM_ACCESS_PROTOCOL    *This,
+  IN OUT UINTN                       *MmramMapSize,
+  IN OUT EFI_MMRAM_DESCRIPTOR        *MmramMap
+  );
+
+///
+///  EFI MM Access Protocol is used to control the visibility of the MMRAM on the platform.
+///  It abstracts the location and characteristics of MMRAM. The platform should report all 
+///  MMRAM via EFI_MM_ACCESS_PROTOCOL. The expectation is that the north bridge or memory 
+///  controller would publish this protocol.
+/// 
+struct _EFI_MM_ACCESS_PROTOCOL {
+  EFI_MM_OPEN          Open;
+  EFI_MM_CLOSE         Close;
+  EFI_MM_LOCK          Lock;
+  EFI_MM_CAPABILITIES  GetCapabilities;
+  ///
+  /// Indicates the current state of the MMRAM. Set to TRUE if MMRAM is locked.
+  ///
+  BOOLEAN               LockState;
+  ///
+  /// Indicates the current state of the MMRAM. Set to TRUE if MMRAM is open.
+  ///
+  BOOLEAN               OpenState;
+};
+
+extern EFI_GUID gEfiMmAccessProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmBase.h b/MdePkg/Include/Protocol/MmBase.h
new file mode 100644
index 0000000..23c3bf4
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmBase.h
@@ -0,0 +1,87 @@
+/** @file
+  EFI MM Base Protocol as defined in the PI 1.2 specification.
+
+  This protocol is utilized by all MM drivers to locate the MM infrastructure services and determine
+  whether the driver is being invoked inside MMRAM or outside of MMRAM.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_BASE_H_
+#define _MM_BASE_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_BASE_PROTOCOL_GUID \
+  { \
+    0xf4ccbfb7, 0xf6e0, 0x47fd, {0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }  \
+  }
+
+typedef struct _EFI_MM_BASE_PROTOCOL  EFI_MM_BASE_PROTOCOL;
+
+/**
+  Service to indicate whether the driver is currently executing in the MM Initialization phase.
+  
+  This service is used to indicate whether the driver is currently executing in the MM Initialization 
+  phase. For MM drivers, this will return TRUE in InMmram while inside the driver's entry point and 
+  otherwise FALSE. For combination MM/DXE drivers, this will return FALSE in the DXE launch. For the
+  MM launch, it behaves as an MM driver.
+
+  @param[in]  This               The EFI_MM_BASE_PROTOCOL instance. 
+  @param[out] InMmram            Pointer to a Boolean which, on return, indicates that the driver is
+                                 currently executing inside of MMRAM (TRUE) or outside of MMRAM (FALSE).
+
+  @retval EFI_SUCCESS            The call returned successfully.
+  @retval EFI_INVALID_PARAMETER  InMmram was NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_INSIDE_OUT)(
+  IN CONST EFI_MM_BASE_PROTOCOL    *This,
+  OUT BOOLEAN                      *InMmram
+  )
+;
+
+/**
+  Returns the location of the Management Mode Service Table (MMST).
+
+  This function returns the location of the Management Mode Service Table (MMST).  The use of the 
+  API is such that a driver can discover the location of the MMST in its entry point and then cache it in 
+  some driver global variable so that the MMST can be invoked in subsequent handlers.
+
+  @param[in]     This            The EFI_MM_BASE_PROTOCOL instance.
+  @param[in,out] Mmst            On return, points to a pointer to the Management Mode Service Table (MMST).
+
+  @retval EFI_SUCCESS            The operation was successful.
+  @retval EFI_INVALID_PARAMETER  Mmst was invalid.
+  @retval EFI_UNSUPPORTED        Not in MM.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_GET_MMST_LOCATION)(
+  IN CONST EFI_MM_BASE_PROTOCOL  *This,
+  IN OUT EFI_MM_SYSTEM_TABLE     **Mmst
+  )
+;
+
+///
+/// EFI MM Base Protocol is utilized by all MM drivers to locate the MM infrastructure
+/// services and determine whether the driver is being invoked inside MMRAM or outside of MMRAM.
+///
+struct _EFI_MM_BASE_PROTOCOL {
+  EFI_MM_INSIDE_OUT         InMm;
+  EFI_MM_GET_MMST_LOCATION  GetMmstLocation;
+};
+
+extern EFI_GUID gEfiMmBaseProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmCommunication.h b/MdePkg/Include/Protocol/MmCommunication.h
new file mode 100644
index 0000000..5dbb38e
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmCommunication.h
@@ -0,0 +1,83 @@
+/** @file
+  EFI MM Communication Protocol as defined in the PI 1.2 specification.
+
+  This protocol provides a means of communicating between drivers outside of MM and MMI 
+  handlers inside of MM.  
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_COMMUNICATION_H_
+#define _MM_COMMUNICATION_H_
+
+#pragma pack(1)
+
+///
+/// To avoid confusion in interpreting frames, the communication buffer should always 
+/// begin with EFI_MM_COMMUNICATE_HEADER
+///
+typedef struct {
+  ///
+  /// Allows for disambiguation of the message format.
+  ///
+  EFI_GUID  HeaderGuid;
+  ///
+  /// Describes the size of Data (in bytes) and does not include the size of the header.
+  ///
+  UINTN     MessageLength;
+  ///
+  /// Designates an array of bytes that is MessageLength in size.
+  ///
+  UINT8     Data[1];
+} EFI_MM_COMMUNICATE_HEADER;
+
+#pragma pack()
+
+#define EFI_MM_COMMUNICATION_PROTOCOL_GUID \
+  { \
+    0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 } \
+  }
+
+typedef struct _EFI_MM_COMMUNICATION_PROTOCOL  EFI_MM_COMMUNICATION_PROTOCOL;
+
+/**
+  Communicates with a registered handler.
+  
+  This function provides a service to send and receive messages from a registered UEFI service.
+
+  @param[in] This                The EFI_MM_COMMUNICATION_PROTOCOL instance.
+  @param[in] CommBuffer          A pointer to the buffer to convey into MMRAM.
+  @param[in] CommSize            The size of the data buffer being passed in.On exit, the size of data
+                                 being returned. Zero if the handler does not wish to reply with any data.
+
+  @retval EFI_SUCCESS            The message was successfully posted.
+  @retval EFI_INVALID_PARAMETER  The CommBuffer was NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_COMMUNICATE)(
+  IN CONST EFI_MM_COMMUNICATION_PROTOCOL   *This,
+  IN OUT VOID                              *CommBuffer,
+  IN OUT UINTN                             *CommSize
+  );
+
+///
+/// EFI MM Communication Protocol provides runtime services for communicating
+/// between DXE drivers and a registered MMI handler.
+///
+struct _EFI_MM_COMMUNICATION_PROTOCOL {
+  EFI_MM_COMMUNICATE  Communicate;
+};
+
+extern EFI_GUID gEfiMmCommunicationProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmConfiguration.h b/MdePkg/Include/Protocol/MmConfiguration.h
new file mode 100644
index 0000000..aacd96c
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmConfiguration.h
@@ -0,0 +1,86 @@
+/** @file
+  EFI MM Configuration Protocol as defined in the PI 1.2 specification.
+
+  This protocol is used to:
+  1) report the portions of MMRAM regions which cannot be used for the MMRAM heap.
+  2) register the MM Foundation entry point with the processor code. The entry
+     point will be invoked by the MM processor entry code.
+  
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_CONFIGURATION_H_
+#define _MM_CONFIGURATION_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_CONFIGURATION_PROTOCOL_GUID \
+  { \
+    0x26eeb3de, 0xb689, 0x492e, {0x80, 0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b, 0xa7 }  \
+  }
+
+///
+/// Structure describing a MMRAM region which cannot be used for the MMRAM heap.
+///
+typedef struct _EFI_MM_RESERVED_MMRAM_REGION {
+  ///
+  /// Starting address of the reserved MMRAM area, as it appears while MMRAM is open. 
+  /// Ignored if MmramReservedSize is 0.
+  ///
+  EFI_PHYSICAL_ADDRESS    MmramReservedStart;
+  ///
+  /// Number of bytes occupied by the reserved MMRAM area. A size of zero indicates the 
+  /// last MMRAM area.
+  ///
+  UINT64                  MmramReservedSize;
+} EFI_MM_RESERVED_MMRAM_REGION;
+
+typedef struct _EFI_MM_CONFIGURATION_PROTOCOL  EFI_MM_CONFIGURATION_PROTOCOL;
+
+/**
+  Register the MM Foundation entry point.
+  
+  This function registers the MM Foundation entry point with the processor code. This entry point 
+  will be invoked by the MM Processor entry code.
+
+  @param[in] This                The EFI_MM_CONFIGURATION_PROTOCOL instance.
+  @param[in] MmEntryPoint        MM Foundation entry point.
+  
+  @retval EFI_SUCCESS            Success to register MM Entry Point.
+  @retval EFI_INVALID_PARAMETER  MmEntryPoint is NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_REGISTER_MM_ENTRY)(
+  IN CONST EFI_MM_CONFIGURATION_PROTOCOL  *This,
+  IN EFI_MM_ENTRY_POINT                   MmEntryPoint
+  );
+
+///
+/// The EFI MM Configuration Protocol is a mandatory protocol published by a DXE CPU driver to
+/// indicate which areas within MMRAM are reserved for use by the CPU for any purpose, 
+/// such as stack, save state or MM entry point.
+///
+/// The RegistermmEntry() function allows the MM IPL DXE driver to register the MM 
+/// Foundation entry point with the MM entry vector code.
+///
+struct _EFI_MM_CONFIGURATION_PROTOCOL {
+  ///
+  /// A pointer to an array MMRAM ranges used by the initial MM entry code.
+  ///
+  EFI_MM_RESERVED_MMRAM_REGION  *MmramReservedRegions;
+  EFI_MM_REGISTER_MM_ENTRY      RegisterMmEntry;
+};
+
+extern EFI_GUID gEfiMmConfigurationProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmControl.h b/MdePkg/Include/Protocol/MmControl.h
new file mode 100644
index 0000000..c8672c5
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmControl.h
@@ -0,0 +1,106 @@
+/** @file
+  EFI MM Control Protocol as defined in the PI 1.2 specification.
+
+  This protocol is used initiate synchronous MMI activations. This protocol could be published by a
+  processor driver to abstract the MMI IPI or a driver which abstracts the ASIC that is supporting the
+  APM port. Because of the possibility of performing MMI IPI transactions, the ability to generate this 
+  event from a platform chipset agent is an optional capability for both IA-32 and x64-based systems.
+
+  The EFI_MM_CONTROL_PROTOCOL is produced by a runtime driver. It provides  an 
+  abstraction of the platform hardware that generates an MMI.  There are often I/O ports that, when 
+  accessed, will generate the MMI.  Also, the hardware optionally supports the periodic generation of 
+  these signals.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_CONTROL_H_
+#define _MM_CONTROL_H_
+
+#include <PiDxe.h>
+
+#define EFI_MM_CONTROL_PROTOCOL_GUID \
+  { \
+    0x843dc720, 0xab1e, 0x42cb, {0x93, 0x57, 0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}  \
+  }
+
+typedef struct _EFI_MM_CONTROL_PROTOCOL  EFI_MM_CONTROL_PROTOCOL;
+typedef UINTN  EFI_MM_PERIOD;
+
+/**
+  Invokes MMI activation from either the preboot or runtime environment.
+
+  This function generates an MMI.
+
+  @param[in]     This                The EFI_MM_CONTROL_PROTOCOL instance.
+  @param[in,out] CommandPort         The value written to the command port.
+  @param[in,out] DataPort            The value written to the data port.
+  @param[in]     Periodic            Optional mechanism to engender a periodic stream.
+  @param[in]     ActivationInterval  Optional parameter to repeat at this period one
+                                     time or, if the Periodic Boolean is set, periodically.
+
+  @retval EFI_SUCCESS            The MMI/PMI has been engendered.
+  @retval EFI_DEVICE_ERROR       The timing is unsupported.
+  @retval EFI_INVALID_PARAMETER  The activation period is unsupported.
+  @retval EFI_INVALID_PARAMETER  The last periodic activation has not been cleared. 
+  @retval EFI_NOT_STARTED        The MM base service has not been initialized.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_ACTIVATE)(
+  IN CONST EFI_MM_CONTROL_PROTOCOL    *This,
+  IN OUT UINT8                        *CommandPort       OPTIONAL,
+  IN OUT UINT8                        *DataPort          OPTIONAL,
+  IN BOOLEAN                          Periodic           OPTIONAL,
+  IN UINTN                            ActivationInterval OPTIONAL
+  );
+
+/**
+  Clears any system state that was created in response to the Trigger() call.
+
+  This function acknowledges and causes the deassertion of the MMI activation source.
+
+  @param[in] This                The EFI_MM_CONTROL_PROTOCOL instance.
+  @param[in] Periodic            Optional parameter to repeat at this period one time
+
+  @retval EFI_SUCCESS            The MMI/PMI has been engendered.
+  @retval EFI_DEVICE_ERROR       The source could not be cleared.
+  @retval EFI_INVALID_PARAMETER  The service did not support the Periodic input argument.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_DEACTIVATE)(
+  IN CONST EFI_MM_CONTROL_PROTOCOL    *This,
+  IN BOOLEAN                          Periodic OPTIONAL
+  );
+
+///
+/// The EFI_MM_CONTROL_PROTOCOL is produced by a runtime driver. It provides  an 
+/// abstraction of the platform hardware that generates an MMI.  There are often I/O ports that, when 
+/// accessed, will generate the MMI.  Also, the hardware optionally supports the periodic generation of 
+/// these signals.
+///
+struct _EFI_MM_CONTROL_PROTOCOL {
+  EFI_MM_ACTIVATE    Trigger;
+  EFI_MM_DEACTIVATE  Clear;
+  ///
+  /// Minimum interval at which the platform can set the period.  A maximum is not 
+  /// specified in that the MM infrastructure code can emulate a maximum interval that is 
+  /// greater than the hardware capabilities by using software emulation in the MM 
+  /// infrastructure code.
+  ///
+  EFI_MM_PERIOD      MinimumTriggerPeriod;
+};
+
+extern EFI_GUID gEfiMmControlProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmCpu.h b/MdePkg/Include/Protocol/MmCpu.h
new file mode 100644
index 0000000..d6ddbcd
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmCpu.h
@@ -0,0 +1,247 @@
+/** @file
+  EFI MM CPU Protocol as defined in the PI 1.2 specification.
+
+  This protocol allows MM drivers to access architecture-standard registers from any of the CPU 
+  save state areas. In some cases, difference processors provide the same information in the save state, 
+  but not in the same format. These so-called pseudo-registers provide this information in a standard 
+  format.  
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_CPU_H_
+#define _MM_CPU_H_
+
+#define EFI_MM_CPU_PROTOCOL_GUID \
+  { \
+    0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22, 0xf8, 0xe9, 0x2b, 0xb3, 0xd5, 0x69 } \
+  }
+
+///
+/// Save State register index
+///
+typedef enum {
+  ///
+  /// x86/X64 standard registers
+  ///
+  EFI_MM_SAVE_STATE_REGISTER_GDTBASE       = 4,
+  EFI_MM_SAVE_STATE_REGISTER_IDTBASE       = 5,
+  EFI_MM_SAVE_STATE_REGISTER_LDTBASE       = 6,
+  EFI_MM_SAVE_STATE_REGISTER_GDTLIMIT      = 7,
+  EFI_MM_SAVE_STATE_REGISTER_IDTLIMIT      = 8,
+  EFI_MM_SAVE_STATE_REGISTER_LDTLIMIT      = 9,
+  EFI_MM_SAVE_STATE_REGISTER_LDTINFO       = 10,
+  EFI_MM_SAVE_STATE_REGISTER_ES            = 20,
+  EFI_MM_SAVE_STATE_REGISTER_CS            = 21,
+  EFI_MM_SAVE_STATE_REGISTER_SS            = 22,
+  EFI_MM_SAVE_STATE_REGISTER_DS            = 23,
+  EFI_MM_SAVE_STATE_REGISTER_FS            = 24,
+  EFI_MM_SAVE_STATE_REGISTER_GS            = 25,
+  EFI_MM_SAVE_STATE_REGISTER_LDTR_SEL      = 26,
+  EFI_MM_SAVE_STATE_REGISTER_TR_SEL        = 27,
+  EFI_MM_SAVE_STATE_REGISTER_DR7           = 28,
+  EFI_MM_SAVE_STATE_REGISTER_DR6           = 29,
+  EFI_MM_SAVE_STATE_REGISTER_R8            = 30,
+  EFI_MM_SAVE_STATE_REGISTER_R9            = 31,
+  EFI_MM_SAVE_STATE_REGISTER_R10           = 32,
+  EFI_MM_SAVE_STATE_REGISTER_R11           = 33,
+  EFI_MM_SAVE_STATE_REGISTER_R12           = 34,
+  EFI_MM_SAVE_STATE_REGISTER_R13           = 35,
+  EFI_MM_SAVE_STATE_REGISTER_R14           = 36,
+  EFI_MM_SAVE_STATE_REGISTER_R15           = 37,  
+  EFI_MM_SAVE_STATE_REGISTER_RAX           = 38,
+  EFI_MM_SAVE_STATE_REGISTER_RBX           = 39,
+  EFI_MM_SAVE_STATE_REGISTER_RCX           = 40,
+  EFI_MM_SAVE_STATE_REGISTER_RDX           = 41,
+  EFI_MM_SAVE_STATE_REGISTER_RSP           = 42,
+  EFI_MM_SAVE_STATE_REGISTER_RBP           = 43,
+  EFI_MM_SAVE_STATE_REGISTER_RSI           = 44,
+  EFI_MM_SAVE_STATE_REGISTER_RDI           = 45,
+  EFI_MM_SAVE_STATE_REGISTER_RIP           = 46,
+  EFI_MM_SAVE_STATE_REGISTER_RFLAGS        = 51,
+  EFI_MM_SAVE_STATE_REGISTER_CR0           = 52,
+  EFI_MM_SAVE_STATE_REGISTER_CR3           = 53,
+  EFI_MM_SAVE_STATE_REGISTER_CR4           = 54,
+  EFI_MM_SAVE_STATE_REGISTER_FCW           = 256,
+  EFI_MM_SAVE_STATE_REGISTER_FSW           = 257,
+  EFI_MM_SAVE_STATE_REGISTER_FTW           = 258,  
+  EFI_MM_SAVE_STATE_REGISTER_OPCODE        = 259,
+  EFI_MM_SAVE_STATE_REGISTER_FP_EIP        = 260,
+  EFI_MM_SAVE_STATE_REGISTER_FP_CS         = 261,
+  EFI_MM_SAVE_STATE_REGISTER_DATAOFFSET    = 262,
+  EFI_MM_SAVE_STATE_REGISTER_FP_DS         = 263,
+  EFI_MM_SAVE_STATE_REGISTER_MM0           = 264,
+  EFI_MM_SAVE_STATE_REGISTER_MM1           = 265,
+  EFI_MM_SAVE_STATE_REGISTER_MM2           = 266,
+  EFI_MM_SAVE_STATE_REGISTER_MM3           = 267,
+  EFI_MM_SAVE_STATE_REGISTER_MM4           = 268,
+  EFI_MM_SAVE_STATE_REGISTER_MM5           = 269,
+  EFI_MM_SAVE_STATE_REGISTER_MM6           = 270,
+  EFI_MM_SAVE_STATE_REGISTER_MM7           = 271,
+  EFI_MM_SAVE_STATE_REGISTER_XMM0          = 272,
+  EFI_MM_SAVE_STATE_REGISTER_XMM1          = 273,
+  EFI_MM_SAVE_STATE_REGISTER_XMM2          = 274,
+  EFI_MM_SAVE_STATE_REGISTER_XMM3          = 275,
+  EFI_MM_SAVE_STATE_REGISTER_XMM4          = 276,
+  EFI_MM_SAVE_STATE_REGISTER_XMM5          = 277,
+  EFI_MM_SAVE_STATE_REGISTER_XMM6          = 278,
+  EFI_MM_SAVE_STATE_REGISTER_XMM7          = 279,
+  EFI_MM_SAVE_STATE_REGISTER_XMM8          = 280,
+  EFI_MM_SAVE_STATE_REGISTER_XMM9          = 281,
+  EFI_MM_SAVE_STATE_REGISTER_XMM10         = 282,
+  EFI_MM_SAVE_STATE_REGISTER_XMM11         = 283,
+  EFI_MM_SAVE_STATE_REGISTER_XMM12         = 284,
+  EFI_MM_SAVE_STATE_REGISTER_XMM13         = 285,
+  EFI_MM_SAVE_STATE_REGISTER_XMM14         = 286,
+  EFI_MM_SAVE_STATE_REGISTER_XMM15         = 287,  
+  ///
+  /// Pseudo-Registers
+  ///
+  EFI_MM_SAVE_STATE_REGISTER_IO            = 512,
+  EFI_MM_SAVE_STATE_REGISTER_LMA           = 513,
+  EFI_MM_SAVE_STATE_REGISTER_PROCESSOR_ID  = 514
+} EFI_MM_SAVE_STATE_REGISTER;  
+
+///
+/// The EFI_MM_SAVE_STATE_REGISTER_LMA pseudo-register values
+/// If the processor acts in 32-bit mode at the time the MMI occurred, the pseudo register value 
+/// EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT is returned in Buffer. Otherwise, 
+/// EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT is returned in Buffer.
+///
+#define EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT  32
+#define EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT  64
+
+///
+/// Size width of I/O instruction
+///
+typedef enum {
+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT8      = 0,
+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT16     = 1,
+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT32     = 2,
+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT64     = 3
+} EFI_MM_SAVE_STATE_IO_WIDTH;
+
+///
+/// Types of I/O instruction
+///
+typedef enum {
+  EFI_MM_SAVE_STATE_IO_TYPE_INPUT       = 1,
+  EFI_MM_SAVE_STATE_IO_TYPE_OUTPUT      = 2,
+  EFI_MM_SAVE_STATE_IO_TYPE_STRING      = 4,
+  EFI_MM_SAVE_STATE_IO_TYPE_REP_PREFIX  = 8
+} EFI_MM_SAVE_STATE_IO_TYPE;
+
+///
+/// Structure of the data which is returned when ReadSaveState() is called with 
+/// EFI_MM_SAVE_STATE_REGISTER_IO. If there was no I/O then ReadSaveState() will 
+/// return EFI_NOT_FOUND.
+///
+/// This structure describes the I/O operation which was in process when the MMI was generated.
+///
+typedef struct _EFI_MM_SAVE_STATE_IO_INFO {
+  ///
+  /// For input instruction (IN, INS), this is data read before the MMI occurred. For output 
+  /// instructions (OUT, OUTS) this is data that was written before the MMI occurred. The 
+  /// width of the data is specified by IoWidth.
+  ///
+  UINT64                        IoData;
+  ///
+  /// The I/O port that was being accessed when the MMI was triggered.
+  ///
+  UINT16                        IoPort;
+  ///
+  /// Defines the size width (UINT8, UINT16, UINT32, UINT64) for IoData.
+  ///
+  EFI_MM_SAVE_STATE_IO_WIDTH    IoWidth;
+  ///
+  /// Defines type of I/O instruction.
+  ///
+  EFI_MM_SAVE_STATE_IO_TYPE     IoType;
+} EFI_MM_SAVE_STATE_IO_INFO;
+  
+typedef struct _EFI_MM_CPU_PROTOCOL  EFI_MM_CPU_PROTOCOL;
+
+/**
+  Read data from the CPU save state.
+
+  This function is used to read the specified number of bytes of the specified register from the CPU 
+  save state of the specified CPU and place the value into the buffer. If the CPU does not support the
+  specified register Register, then EFI_NOT_FOUND  should be returned. If the CPU does not 
+  support the specified register width Width, then EFI_INVALID_PARAMETER is returned.
+
+  @param[in]  This               The EFI_MM_CPU_PROTOCOL instance.
+  @param[in]  Width              The number of bytes to read from the CPU save state.
+  @param[in]  Register           Specifies the CPU register to read form the save state.
+  @param[in]  CpuIndex           Specifies the zero-based index of the CPU save state.
+  @param[out] Buffer             Upon return, this holds the CPU register value read from the save state.
+    
+  @retval EFI_SUCCESS            The register was read from Save State.
+  @retval EFI_NOT_FOUND          The register is not defined for the Save State of Processor.
+  @retval EFI_INVALID_PARAMETER  Input parameters are not valid, for example, Processor No or register width 
+                                 is not correct.This or Buffer is NULL.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_READ_SAVE_STATE)(
+  IN CONST EFI_MM_CPU_PROTOCOL    *This,
+  IN UINTN                        Width,
+  IN EFI_MM_SAVE_STATE_REGISTER   Register,
+  IN UINTN                        CpuIndex,
+  OUT VOID                        *Buffer
+  );
+
+
+/**
+  Write data to the CPU save state.
+
+  This function is used to write the specified number of bytes of the specified register to the CPU save 
+  state of the specified CPU and place the value into the buffer. If the CPU does not support the 
+  specified register Register, then EFI_UNSUPPORTED should be returned. If the CPU does not 
+  support the specified register width Width, then EFI_INVALID_PARAMETER is returned.
+
+  @param[in]  This               The EFI_MM_CPU_PROTOCOL instance.
+  @param[in]  Width              The number of bytes to write to the CPU save state.
+  @param[in]  Register           Specifies the CPU register to write to the save state.
+  @param[in]  CpuIndex           Specifies the zero-based index of the CPU save state.
+  @param[in]  Buffer             Upon entry, this holds the new CPU register value.
+  
+  @retval EFI_SUCCESS            The register was written to Save State.
+  @retval EFI_NOT_FOUND          The register is not defined for the Save State of Processor.
+  @retval EFI_INVALID_PARAMETER  Input parameters are not valid. For example: 
+                                 ProcessorIndex or Width is not correct.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_WRITE_SAVE_STATE)(
+  IN CONST EFI_MM_CPU_PROTOCOL    *This,
+  IN UINTN                        Width, 
+  IN EFI_MM_SAVE_STATE_REGISTER   Register,
+  IN UINTN                        CpuIndex,
+  IN CONST VOID                   *Buffer
+  );
+
+///
+/// EFI MM CPU Protocol provides access to CPU-related information while in MM.
+///
+/// This protocol allows MM drivers to access architecture-standard registers from any of the CPU 
+/// save state areas. In some cases, difference processors provide the same information in the save state, 
+/// but not in the same format. These so-called pseudo-registers provide this information in a standard 
+/// format.  
+///
+struct _EFI_MM_CPU_PROTOCOL {
+  EFI_MM_READ_SAVE_STATE   ReadSaveState;
+  EFI_MM_WRITE_SAVE_STATE  WriteSaveState;
+};
+
+extern EFI_GUID gEfiMmCpuProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmCpuIo.h b/MdePkg/Include/Protocol/MmCpuIo.h
new file mode 100644
index 0000000..9fda26c
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmCpuIo.h
@@ -0,0 +1,96 @@
+/** @file
+  MM CPU I/O 2 protocol as defined in the PI 1.2 specification.
+
+  This protocol provides CPU I/O and memory access within MM.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_CPU_IO_H_
+#define _MM_CPU_IO_H_
+
+#define EFI_MM_CPU_IO_PROTOCOL_GUID \
+  { \
+    0x3242A9D8, 0xCE70, 0x4AA0, { 0x95, 0x5D, 0x5E, 0x7B, 0x14, 0x0D, 0xE4, 0xD2 } \
+  }
+
+typedef struct _EFI_MM_CPU_IO_PROTOCOL  EFI_MM_CPU_IO_PROTOCOL;
+
+///
+/// Width of the MM CPU I/O operations
+///
+typedef enum {
+  MM_IO_UINT8  = 0,
+  MM_IO_UINT16 = 1,
+  MM_IO_UINT32 = 2,
+  MM_IO_UINT64 = 3
+} EFI_MM_IO_WIDTH;
+
+/**
+  Provides the basic memory and I/O interfaces used toabstract accesses to devices.
+
+  The I/O operations are carried out exactly as requested.  The caller is 
+  responsible for any alignment and I/O width issues that the bus, device, 
+  platform, or type of I/O might require.
+
+  @param[in]      This     The EFI_MM_CPU_IO_PROTOCOL instance.
+  @param[in]      Width    Signifies the width of the I/O operations.
+  @param[in]      Address  The base address of the I/O operations.  The caller is 
+                           responsible for aligning the Address if required. 
+  @param[in]      Count    The number of I/O operations to perform.
+  @param[in,out]  Buffer   For read operations, the destination buffer to store 
+                           the results.  For write operations, the source buffer 
+                           from which to write data.
+
+  @retval EFI_SUCCESS            The data was read from or written to the device.
+  @retval EFI_UNSUPPORTED        The Address is not valid for this system.
+  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
+  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack
+                                 of resources.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_CPU_IO)(
+  IN     CONST EFI_MM_CPU_IO_PROTOCOL    *This,
+  IN     EFI_MM_IO_WIDTH                 Width,
+  IN     UINT64                          Address,
+  IN     UINTN                           Count,
+  IN OUT VOID                            *Buffer
+  );
+
+typedef struct {
+  ///
+  /// This service provides the various modalities of memory and I/O read.
+  ///
+  EFI_MM_CPU_IO  Read;
+  ///
+  /// This service provides the various modalities of memory and I/O write.
+  ///
+  EFI_MM_CPU_IO  Write;
+} EFI_MM_IO_ACCESS;
+
+///
+/// MM CPU I/O Protocol provides CPU I/O and memory access within MM.
+///
+struct _EFI_MM_CPU_IO_PROTOCOL {
+  ///
+  /// Allows reads and writes to memory-mapped I/O space.
+  ///
+  EFI_MM_IO_ACCESS Mem;
+  ///
+  /// Allows reads and writes to I/O space.
+  ///
+  EFI_MM_IO_ACCESS Io;
+};
+
+extern EFI_GUID gEfiMmCpuIoProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmEndOfDxe.h b/MdePkg/Include/Protocol/MmEndOfDxe.h
new file mode 100644
index 0000000..6c3f17a
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmEndOfDxe.h
@@ -0,0 +1,33 @@
+/** @file
+  MM End Of Dxe protocol introduced in the PI 1.2.1 specification.
+
+  According to PI 1.4a specification, this protocol indicates end of the
+  execution phase when all of the components are under the authority of
+  the platform manufacturer.
+  This protocol is a mandatory protocol published by MM Foundation code.
+  This protocol is an MM counterpart of the End of DXE Event.
+  This protocol prorogates End of DXE notification into MM environment.
+  This protocol is installed prior to installation of the MM Ready to Lock Protocol.
+
+  Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_END_OF_DXE_H_
+#define _MM_END_OF_DXE_H_
+
+#define EFI_MM_END_OF_DXE_PROTOCOL_GUID \
+  { \
+    0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d } \
+  }
+
+extern EFI_GUID gEfiMmEndOfDxeProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmGpiDispatch.h b/MdePkg/Include/Protocol/MmGpiDispatch.h
new file mode 100644
index 0000000..5682e75
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmGpiDispatch.h
@@ -0,0 +1,125 @@
+/** @file
+  MM General Purpose Input (GPI) Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides the parent dispatch service for the General Purpose Input 
+  (GPI) MMI source generator.
+
+  The EFI_MM_GPI_DISPATCH_PROTOCOL provides the ability to install child handlers for the 
+  given event types.  Several inputs can be enabled.  This purpose of this interface is to generate an 
+  MMI in response to any of these inputs having a true value provided.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_GPI_DISPATCH_H_
+#define _MM_GPI_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_GPI_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x25566b03, 0xb577, 0x4cbf, {0x95, 0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43, 0x80 } \
+  }
+
+///
+/// The dispatch function's context.
+///
+typedef struct {
+  ///
+  /// A number from one of 2^64 possible GPIs that can generate an MMI. A
+  /// 0 corresponds to logical GPI[0]; 1 corresponds to logical GPI[1]; and
+  /// GpiNum of N corresponds to GPI[N], where N can span from 0 to 2^64-1.
+  ///
+  UINT64 GpiNum;
+} EFI_MM_GPI_REGISTER_CONTEXT;
+
+typedef struct _EFI_MM_GPI_DISPATCH_PROTOCOL EFI_MM_GPI_DISPATCH_PROTOCOL;
+
+/**
+  Registers a child MMI source dispatch function with a parent MM driver.
+
+  This service registers a function (DispatchFunction) which will be called when an MMI is 
+  generated because of one or more of the GPIs specified by RegisterContext. On return, 
+  DispatchHandle contains a unique handle which may be used later to unregister the function 
+  using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer pointing to another instance of 
+  EFI_MM_GPI_REGISTER_CONTEXT describing the GPIs which actually caused the MMI and 
+  CommBufferSize pointing to the size of the structure.
+
+  @param[in]  This               Pointer to the EFI_MM_GPI_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when the specified GPI causes an MMI.
+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
+                                 The caller fills this context in before calling
+                                 the register function to indicate to the register
+                                 function the GPI(s) for which the dispatch function
+                                 should be invoked.
+  @param[out] DispatchHandle     Handle generated by the dispatcher to track the
+                                 function instance.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The GPI input value
+                                 is not within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_GPI_REGISTER)(
+  IN CONST EFI_MM_GPI_DISPATCH_PROTOCOL    *This,
+  IN       EFI_MM_HANDLER_ENTRY_POINT      DispatchFunction,
+  IN CONST EFI_MM_GPI_REGISTER_CONTEXT     *RegisterContext,
+  OUT      EFI_HANDLE                      *DispatchHandle
+  );
+
+/**
+  Unregisters a General Purpose Input (GPI) service.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called when the GPI triggers an MMI. 
+
+  @param[in]  This               Pointer to the EFI_MM_GPI_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchHandle     Handle of the service to remove.
+
+  @retval EFI_SUCCESS            Handle of the service to remove.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_GPI_UNREGISTER)(
+  IN CONST EFI_MM_GPI_DISPATCH_PROTOCOL    *This,
+  IN       EFI_HANDLE                      DispatchHandle
+  );
+
+///
+/// Interface structure for the MM GPI MMI Dispatch Protocol
+///
+/// The MM GPI MMI Dispatch Protocol provides the parent dispatch service
+/// for the General Purpose Input (GPI) MMI source generator.
+///
+struct _EFI_MM_GPI_DISPATCH_PROTOCOL {
+  EFI_MM_GPI_REGISTER    Register;
+  EFI_MM_GPI_UNREGISTER  UnRegister;
+  ///
+  /// Denotes the maximum value of inputs that can have handlers attached.
+  ///
+  UINTN                   NumSupportedGpis;
+};
+
+extern EFI_GUID gEfiMmGpiDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmIoTrapDispatch.h b/MdePkg/Include/Protocol/MmIoTrapDispatch.h
new file mode 100644
index 0000000..ae116a0
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmIoTrapDispatch.h
@@ -0,0 +1,136 @@
+/** @file
+  MM IO Trap Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides a parent dispatch service for IO trap MMI sources.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_IO_TRAP_DISPATCH_H_
+#define _MM_IO_TRAP_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_IO_TRAP_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x58dc368d, 0x7bfa, 0x4e77, {0xab, 0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 } \
+  }
+
+///
+/// IO Trap valid types
+///
+typedef enum {
+  WriteTrap,
+  ReadTrap,
+  ReadWriteTrap,
+  IoTrapTypeMaximum
+} EFI_MM_IO_TRAP_DISPATCH_TYPE;
+
+///
+/// IO Trap context structure containing information about the
+/// IO trap event that should invoke the handler
+///
+typedef struct {
+  UINT16                         Address;
+  UINT16                         Length;
+  EFI_MM_IO_TRAP_DISPATCH_TYPE   Type;
+} EFI_MM_IO_TRAP_REGISTER_CONTEXT;
+
+///
+/// IO Trap context structure containing information about the IO trap that occurred
+///
+typedef struct {
+  UINT32  WriteData;
+} EFI_MM_IO_TRAP_CONTEXT;
+
+typedef struct _EFI_MM_IO_TRAP_DISPATCH_PROTOCOL EFI_MM_IO_TRAP_DISPATCH_PROTOCOL;
+
+/**
+  Register an IO trap MMI child handler for a specified MMI.
+
+  This service registers a function (DispatchFunction) which will be called when an MMI is 
+  generated because of an access to an I/O port specified by RegisterContext. On return, 
+  DispatchHandle contains a unique handle which may be used later to unregister the function 
+  using UnRegister(). If the base of the I/O range specified is zero, then an I/O range with the 
+  specified length and characteristics will be allocated and the Address field in RegisterContext 
+  updated. If no range could be allocated, then EFI_OUT_OF_RESOURCES will be returned. 
+
+  The service will not perform GCD allocation if the base address is non-zero or 
+  EFI_MM_READY_TO_LOCK has been installed.  In this case, the caller is responsible for the 
+  existence and allocation of the specific IO range.
+  An error may be returned if some or all of the requested resources conflict with an existing IO trap 
+  child handler.
+
+  It is not required that implementations will allow multiple children for a single IO trap MMI source.  
+  Some implementations may support multiple children.
+  The DispatchFunction will be called with Context updated to contain information 
+  concerning the I/O action that actually happened and is passed in RegisterContext, with 
+  CommBuffer pointing to the data actually written and CommBufferSize pointing to the size of 
+  the data in CommBuffer.
+
+  @param[in]  This               Pointer to the EFI_MM_IO_TRAP_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when I/O trap location is accessed.
+  @param[in]  RegisterContext    Pointer to the dispatch function's context.  The caller fills this
+                                 context in before calling the register function to indicate to the register
+                                 function the IO trap MMI source for which the dispatch function should be invoked.
+  @param[out] DispatchHandle     Handle of the dispatch function, for when interfacing with the parent MM driver.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully registered.
+  @retval EFI_DEVICE_ERROR       The driver was unable to complete due to hardware error.
+  @retval EFI_OUT_OF_RESOURCES   Insufficient resources are available to fulfill the IO trap range request.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid.  The input value is not within a valid range.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_IO_TRAP_DISPATCH_REGISTER)(
+  IN CONST EFI_MM_IO_TRAP_DISPATCH_PROTOCOL    *This,
+  IN       EFI_MM_HANDLER_ENTRY_POINT          DispatchFunction,
+  IN OUT   EFI_MM_IO_TRAP_REGISTER_CONTEXT     *RegisterContext,
+     OUT   EFI_HANDLE                          *DispatchHandle
+  );
+
+/**
+  Unregister a child MMI source dispatch function with a parent MM driver.
+
+  This service removes a previously installed child dispatch handler. This does not guarantee that the 
+  system resources will be freed from the GCD.
+
+  @param[in] This                Pointer to the EFI_MM_IO_TRAP_DISPATCH_PROTOCOL instance. 
+  @param[in] DispatchHandle      Handle of the child service to remove.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_IO_TRAP_DISPATCH_UNREGISTER)(
+  IN CONST EFI_MM_IO_TRAP_DISPATCH_PROTOCOL    *This,
+  IN       EFI_HANDLE                          DispatchHandle
+  );
+
+///
+/// Interface structure for the MM IO Trap Dispatch Protocol.
+///
+/// This protocol provides a parent dispatch service for IO trap MMI sources.
+///
+struct _EFI_MM_IO_TRAP_DISPATCH_PROTOCOL {
+  EFI_MM_IO_TRAP_DISPATCH_REGISTER    Register;
+  EFI_MM_IO_TRAP_DISPATCH_UNREGISTER  UnRegister;
+};
+
+extern EFI_GUID gEfiMmIoTrapDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmPciRootBridgeIo.h b/MdePkg/Include/Protocol/MmPciRootBridgeIo.h
new file mode 100644
index 0000000..a3f3946
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmPciRootBridgeIo.h
@@ -0,0 +1,37 @@
+/** @file
+  MM PCI Root Bridge IO protocol as defined in the PI 1.2 specification.
+
+  This protocol provides PCI I/O and memory access within MM.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_PCI_ROOT_BRIDGE_IO_H_
+#define _MM_PCI_ROOT_BRIDGE_IO_H_
+
+#include <Protocol/PciRootBridgeIo.h>
+
+#define EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \
+  { \
+    0x8bc1714d, 0xffcb, 0x41c3, { 0x89, 0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98, 0xea } \
+  }
+
+///
+/// This protocol provides the same functionality as the PCI Root Bridge I/O Protocol defined in the 
+/// UEFI 2.1 Specifcation, section 13.2, except that the functions for Map() and Unmap() may return 
+/// EFI_UNSUPPORTED.
+///
+typedef EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL;
+
+extern EFI_GUID gEfiMmPciRootBridgeIoProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h b/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
new file mode 100644
index 0000000..4f88dc8
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
@@ -0,0 +1,170 @@
+/** @file
+  MM Periodic Timer Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides the parent dispatch service for the periodical timer MMI source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_PERIODIC_TIMER_DISPATCH_H_
+#define _MM_PERIODIC_TIMER_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x4cec368e, 0x8e8e, 0x4d71, {0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a, 0x53 } \
+  }
+
+///
+/// Example: A chipset supports periodic MMIs on every 64ms or 2 seconds.
+///   A child wishes schedule a period MMI to fire on a period of 3 seconds, there
+///   are several ways to approach the problem:
+///   1. The child may accept a 4 second periodic rate, in which case it registers with
+///        Period = 40000
+///        MmiTickInterval = 20000
+///      The resulting MMI will occur every 2 seconds with the child called back on
+///      every 2nd MMI.
+///      NOTE: the same result would occur if the child set MmiTickInterval = 0.
+///   2. The child may choose the finer granularity MMI (64ms):
+///        Period = 30000
+///        MmiTickInterval = 640
+///      The resulting MMI will occur every 64ms with the child called back on
+///      every 47th MMI.
+///      NOTE: the child driver should be aware that this will result in more
+///        MMIs occuring during system runtime which can negatively impact system
+///        performance.
+///
+typedef struct {
+  ///
+  /// The minimum period of time in 100 nanosecond units that the child gets called. The 
+  /// child will be called back after a time greater than the time Period.
+  ///
+  UINT64  Period;
+  ///
+  /// The period of time interval between MMIs. Children of this interface should use this 
+  /// field when registering for periodic timer intervals when a finer granularity periodic 
+  /// MMI is desired.
+  ///
+  UINT64  MmiTickInterval;
+} EFI_MM_PERIODIC_TIMER_REGISTER_CONTEXT;
+
+///
+/// The DispatchFunction will be called with Context set to the same value as was passed into 
+/// Register() in RegisterContext and with CommBuffer pointing to an instance of 
+/// EFI_MM_PERIODIC_TIMER_CONTEXT and CommBufferSize pointing to its size.
+///
+typedef struct {
+  ///
+  /// ElapsedTime is the actual time in 100 nanosecond units elapsed since last called, a
+  /// value of 0 indicates an unknown amount of time.
+  ///
+  UINT64  ElapsedTime;
+} EFI_MM_PERIODIC_TIMER_CONTEXT;
+
+typedef struct _EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL  EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL;
+
+/**
+  Register a child MMI source dispatch function for MM periodic timer.
+
+  This service registers a function (DispatchFunction) which will be called when at least the 
+  amount of time specified by RegisterContext has elapsed. On return, DispatchHandle 
+  contains a unique handle which may be used later to unregister the function using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer pointing to an instance of 
+  EFI_MM_PERIODIC_TIMER_CONTEXT and CommBufferSize pointing to its size.
+
+  @param[in]  This               Pointer to the EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when at least the specified amount
+                                 of time has elapsed. 
+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
+                                 The caller fills this context in before calling
+                                 the register function to indicate to the register
+                                 function the period at which the dispatch function
+                                 should be invoked.
+  @param[out] DispatchHandle     Handle generated by the dispatcher to track the function instance. 
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The period input value
+                                 is not within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_PERIODIC_TIMER_REGISTER)(
+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL    *This,
+  IN       EFI_MM_HANDLER_ENTRY_POINT                 DispatchFunction,
+  IN CONST EFI_MM_PERIODIC_TIMER_REGISTER_CONTEXT     *RegisterContext,
+  OUT      EFI_HANDLE                                 *DispatchHandle
+  );
+
+/**
+  Unregisters a periodic timer service.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called when the time has elapsed.
+
+  @param[in] This                Pointer to the EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchHandle      Handle of the service to remove.
+
+  @retval EFI_SUCCESS            The service has been successfully removed.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_PERIODIC_TIMER_UNREGISTER)(
+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                               DispatchHandle
+  );
+
+/**
+  Returns the next MMI tick period supported by the chipset.
+
+  The order returned is from longest to shortest interval period.
+
+  @param[in]     This             Pointer to the EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
+  @param[in,out] MmiTickInterval  Pointer to pointer of next shorter MMI interval
+                                  period supported by the child. This parameter works as a get-first,
+                                  get-next field.The first time this function is called, *MmiTickInterval
+                                  should be set to NULL to get the longest MMI interval.The returned
+                                  *MmiTickInterval should be passed in on subsequent calls to get the
+                                  next shorter interval period until *MmiTickInterval = NULL.
+
+  @retval EFI_SUCCESS             The service returned successfully.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_PERIODIC_TIMER_INTERVAL)(
+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL  *This,
+  IN OUT UINT64                                     **MmiTickInterval
+  );
+
+///
+/// Interface structure for the MM Periodic Timer Dispatch Protocol
+///
+/// This protocol provides the parent dispatch service for the periodical timer MMI source generator.
+///
+struct _EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL {
+  EFI_MM_PERIODIC_TIMER_REGISTER    Register;
+  EFI_MM_PERIODIC_TIMER_UNREGISTER  UnRegister;
+  EFI_MM_PERIODIC_TIMER_INTERVAL    GetNextShorterInterval;
+};
+
+extern EFI_GUID gEfiMmPeriodicTimerDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmPowerButtonDispatch.h b/MdePkg/Include/Protocol/MmPowerButtonDispatch.h
new file mode 100644
index 0000000..7f1a4e2
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmPowerButtonDispatch.h
@@ -0,0 +1,117 @@
+/** @file
+  MM Power Button Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides the parent dispatch service for the power button MMI source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_POWER_BUTTON_DISPATCH_H_
+#define _MM_POWER_BUTTON_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x1b1183fa, 0x1823, 0x46a7, {0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d } \
+  }
+
+///
+/// Power Button phases.
+///
+typedef enum {
+  EfiPowerButtonEntry,
+  EfiPowerButtonExit,
+  EfiPowerButtonMax
+} EFI_POWER_BUTTON_PHASE;
+
+///
+/// The dispatch function's context.
+///
+typedef struct {
+  ///
+  /// Designates whether this handler should be invoked upon entry or exit.
+  ///
+  EFI_POWER_BUTTON_PHASE  Phase;
+} EFI_MM_POWER_BUTTON_REGISTER_CONTEXT;
+
+typedef struct _EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL;
+
+/**
+  Provides the parent dispatch service for a power button event.
+
+  This service registers a function (DispatchFunction) which will be called when an MMI is 
+  generated because the power button was pressed or released, as specified by RegisterContext. 
+  On return, DispatchHandle contains a unique handle which may be used later to unregister the 
+  function using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer and CommBufferSize set to NULL.
+
+  @param[in]  This               Pointer to the EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when power button is pressed or released.
+  @param[in]  RegisterContext    Pointer to the dispatch function's context. The caller fills in this context
+                                 before calling the Register() function to indicate to the Register() function
+                                 the power button MMI phase for which the dispatch function should be invoked.
+  @param[out] DispatchHandle     Handle generated by the dispatcher to track the function instance. 
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The power button input value
+                                 is not within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_POWER_BUTTON_REGISTER)(
+  IN CONST EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL  *This,
+  IN       EFI_MM_HANDLER_ENTRY_POINT             DispatchFunction,
+  IN       EFI_MM_POWER_BUTTON_REGISTER_CONTEXT   *RegisterContext,
+  OUT      EFI_HANDLE                             *DispatchHandle
+  );
+
+/**
+  Unregisters a power-button service.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called when the standby button is pressed or released. 
+
+  @param[in] This                Pointer to the EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchHandle      Handle of the service to remove.
+
+  @retval EFI_SUCCESS            The service has been successfully removed.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_POWER_BUTTON_UNREGISTER)(
+  IN CONST EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                             DispatchHandle
+  );
+
+///
+/// Interface structure for the MM Power Button Dispatch Protocol.
+///
+/// This protocol provides the parent dispatch service for the power button MMI source generator.
+///
+struct _EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL {
+  EFI_MM_POWER_BUTTON_REGISTER    Register;
+  EFI_MM_POWER_BUTTON_UNREGISTER  UnRegister;
+};
+
+extern EFI_GUID gEfiMmPowerButtonDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmReadyToLock.h b/MdePkg/Include/Protocol/MmReadyToLock.h
new file mode 100644
index 0000000..7752c71
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmReadyToLock.h
@@ -0,0 +1,35 @@
+/** @file
+  MM Ready To Lock protocol introduced in the PI 1.2 specification.
+
+  According to PI 1.4a specification, this MM protocol indicates that
+  MM resources and services that should not be used by the third party
+  code are about to be locked.
+  This protocol is a mandatory protocol published by the MM Foundation
+  code when the system is preparing to lock certain resources and interfaces
+  in anticipation of the invocation of 3rd party extensible modules.
+  This protocol is an MM counterpart of the DXE MM Ready to Lock Protocol.
+  This protocol prorogates resource locking notification into MM environment.
+  This protocol is installed after installation of the MM End of DXE Protocol.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_READY_TO_LOCK_H_
+#define _MM_READY_TO_LOCK_H_
+
+#define EFI_MM_READY_TO_LOCK_PROTOCOL_GUID \
+  { \
+    0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82, 0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 } \
+  }
+
+extern EFI_GUID gEfiMmReadyToLockProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h b/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
new file mode 100644
index 0000000..9f967b3
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
@@ -0,0 +1,81 @@
+/** @file
+  This protocol provides registering and unregistering services to status code consumers while in DXE MM.
+  
+  Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __MM_REPORT_STATUS_CODE_HANDLER_PROTOCOL_H__
+#define __MM_REPORT_STATUS_CODE_HANDLER_PROTOCOL_H__
+
+#define EFI_MM_RSC_HANDLER_PROTOCOL_GUID \
+  { \
+    0x2ff29fa7, 0x5e80, 0x4ed9, {0xb3, 0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4} \
+  }
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_RSC_HANDLER_CALLBACK)(
+  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
+);
+
+/**
+  Register the callback function for ReportStatusCode() notification.
+  
+  When this function is called the function pointer is added to an internal list and any future calls to
+  ReportStatusCode() will be forwarded to the Callback function.
+  
+  @param[in] Callback               A pointer to a function of type EFI_MM_RSC_HANDLER_CALLBACK that is 
+                                    called when a call to ReportStatusCode() occurs.
+
+  @retval EFI_SUCCESS               Function was successfully registered.
+  @retval EFI_INVALID_PARAMETER     The callback function was NULL.
+  @retval EFI_OUT_OF_RESOURCES      The internal buffer ran out of space. No more functions can be
+                                    registered.
+  @retval EFI_ALREADY_STARTED       The function was already registered. It can't be registered again.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_RSC_HANDLER_REGISTER)(
+  IN EFI_MM_RSC_HANDLER_CALLBACK Callback
+);
+
+/**
+  Remove a previously registered callback function from the notification list.
+  
+  A callback function must be unregistered before it is deallocated. It is important that any registered
+  callbacks that are not runtime complaint be unregistered when ExitBootServices() is called.
+
+  @param[in] Callback           A pointer to a function of type EFI_MM_RSC_HANDLER_CALLBACK that is to be
+                                unregistered.
+                        
+  @retval EFI_SUCCESS           The function was successfully unregistered.
+  @retval EFI_INVALID_PARAMETER The callback function was NULL.
+  @retval EFI_NOT_FOUND         The callback function was not found to be unregistered.
+                            
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_RSC_HANDLER_UNREGISTER)(
+  IN EFI_MM_RSC_HANDLER_CALLBACK Callback
+);
+
+typedef struct _EFI_MM_RSC_HANDLER_PROTOCOL {
+  EFI_MM_RSC_HANDLER_REGISTER      Register;
+  EFI_MM_RSC_HANDLER_UNREGISTER    Unregister;
+} EFI_MM_RSC_HANDLER_PROTOCOL;
+
+extern EFI_GUID gEfiMmRscHandlerProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h b/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
new file mode 100644
index 0000000..7dcb49c
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
@@ -0,0 +1,119 @@
+/** @file
+  MM Standby Button Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides the parent dispatch service for the standby button MMI source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_STANDBY_BUTTON_DISPATCH_H_
+#define _MM_STANDBY_BUTTON_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x7300c4a1, 0x43f2, 0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b } \
+  }
+
+///
+/// Standby Button phases
+///
+typedef enum {
+  EfiStandbyButtonEntry,
+  EfiStandbyButtonExit,
+  EfiStandbyButtonMax
+} EFI_STANDBY_BUTTON_PHASE;
+
+///
+/// The dispatch function's context.
+///
+typedef struct {
+  ///
+  /// Describes whether the child handler should be invoked upon the entry to the button 
+  /// activation or upon exit.
+  ///
+  EFI_STANDBY_BUTTON_PHASE  Phase;
+} EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT;
+
+typedef struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL;
+
+/**
+  Provides the parent dispatch service for a standby button event.
+
+  This service registers a function (DispatchFunction) which will be called when an MMI is 
+  generated because the standby button was pressed or released, as specified by 
+  RegisterContext. On return, DispatchHandle contains a unique handle which may be used 
+  later to unregister the function using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer and CommBufferSize set to NULL. 
+
+  @param[in]  This               Pointer to the EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when the standby button is pressed or released.
+  @param[in]  RegisterContext    Pointer to the dispatch function's context. The caller fills in this context
+                                 before calling the register function to indicate to the register function the 
+                                 standby button MMI source for which the dispatch function should be invoked.
+  @param[out] DispatchHandle     Handle generated by the dispatcher to track the function instance. 
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The standby button input value
+                                 is not within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_STANDBY_BUTTON_REGISTER)(
+  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
+  IN       EFI_MM_HANDLER_ENTRY_POINT               DispatchFunction,
+  IN       EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT   *RegisterContext,
+  OUT      EFI_HANDLE                               *DispatchHandle
+  );
+
+/**
+  Unregisters a child MMI source dispatch function with a parent MM driver.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called when the standby button is pressed or released.
+
+  @param[in] This                Pointer to the EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchHandle      Handle of the service to remove.
+
+  @retval EFI_SUCCESS            The service has been successfully removed.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_STANDBY_BUTTON_UNREGISTER)(
+  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                               DispatchHandle
+  );
+
+///
+/// Interface structure for the MM Standby Button Dispatch Protocol.
+///
+/// This protocol provides the parent dispatch service for the standby
+/// button MMI source generator.
+///
+struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL {
+  EFI_MM_STANDBY_BUTTON_REGISTER    Register;
+  EFI_MM_STANDBY_BUTTON_UNREGISTER  UnRegister;
+};
+
+extern EFI_GUID gEfiMmStandbyButtonDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmStatusCode.h b/MdePkg/Include/Protocol/MmStatusCode.h
new file mode 100644
index 0000000..d0bfbac
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmStatusCode.h
@@ -0,0 +1,65 @@
+/** @file
+  EFI MM Status Code Protocol as defined in the PI 1.2 specification.
+
+  This protocol provides the basic status code services while in MM. 
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  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        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+**/
+
+#ifndef _MM_STATUS_CODE_H__
+#define _MM_STATUS_CODE_H__
+
+
+#define EFI_MM_STATUS_CODE_PROTOCOL_GUID \
+  { \
+    0x6afd2b77, 0x98c1, 0x4acd, {0xa6, 0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1} \
+  }
+
+typedef struct _EFI_MM_STATUS_CODE_PROTOCOL  EFI_MM_STATUS_CODE_PROTOCOL;
+
+/**
+  Service to emit the status code in MM.    
+
+  The EFI_MM_STATUS_CODE_PROTOCOL.ReportStatusCode() function enables a driver 
+  to emit a status code while in MM.  The reason that there is a separate protocol definition from the 
+  DXE variant of this service is that the publisher of this protocol will provide a service that is 
+  capability of coexisting with a foreground operational environment, such as an operating system 
+  after the termination of boot services.  
+
+  @param[in] This                Points to this instance of the EFI_MM_STATUS_CODE_PROTOCOL.
+  @param[in] CodeType            DIndicates the type of status code being reported. 
+  @param[in] Value               Describes the current status of a hardware or software entity. 
+  @param[in] Instance            The enumeration of a hardware or software entity within the system.
+  @param[in] CallerId            This optional parameter may be used to identify the caller.
+  @param[in] Data                This optional parameter may be used to pass additional data.
+
+  @retval EFI_SUCCESS            The function completed successfully.
+  @retval EFI_INVALID_PARAMETER  The function should not be completed due to a device error.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_REPORT_STATUS_CODE)(
+  IN CONST EFI_MM_STATUS_CODE_PROTOCOL   *This,
+  IN EFI_STATUS_CODE_TYPE                CodeType,
+  IN EFI_STATUS_CODE_VALUE               Value,
+  IN UINT32                              Instance,
+  IN CONST EFI_GUID                      *CallerId,
+  IN EFI_STATUS_CODE_DATA                *Data OPTIONAL
+  );
+
+struct _EFI_MM_STATUS_CODE_PROTOCOL {
+  EFI_MM_REPORT_STATUS_CODE  ReportStatusCode;
+};
+
+extern EFI_GUID gEfiMmStatusCodeProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/Include/Protocol/MmSwDispatch.h b/MdePkg/Include/Protocol/MmSwDispatch.h
new file mode 100644
index 0000000..004c235
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmSwDispatch.h
@@ -0,0 +1,136 @@
+/** @file
+  MM Software Dispatch Protocol introduced from PI 1.2 Specification
+  Volume 4 Management Mode Core Interface.
+
+  This protocol provides the parent dispatch service for a given MMI source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_SW_DISPATCH2_H_
+#define _MM_SW_DISPATCH2_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_SW_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x18a3c6dc, 0x5eea, 0x48c8, {0xa1, 0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 } \
+  }
+
+///
+/// A particular chipset may not support all possible software MMI input values.
+/// For example, the ICH supports only values 00h to 0FFh.  The parent only allows a single
+/// child registration for each SwMmiInputValue.
+///
+typedef struct {
+  UINTN SwMmiInputValue;
+} EFI_MM_SW_REGISTER_CONTEXT;
+
+///
+/// The DispatchFunction will be called with Context set to the same value as was passed into 
+/// this function in RegisterContext and with CommBuffer (and CommBufferSize) pointing
+/// to an instance of EFI_MM_SW_CONTEXT indicating the index of the CPU which generated the 
+/// software MMI.
+///
+typedef struct {
+  ///
+  /// The 0-based index of the CPU which generated the software MMI.
+  ///
+  UINTN SwMmiCpuIndex;
+  ///
+  /// This value corresponds directly to the CommandPort parameter used in the call to Trigger().
+  ///
+  UINT8 CommandPort;
+  ///
+  /// This value corresponds directly to the DataPort parameter used in the call to Trigger().
+  ///
+  UINT8 DataPort;
+} EFI_MM_SW_CONTEXT;
+
+typedef struct _EFI_MM_SW_DISPATCH_PROTOCOL  EFI_MM_SW_DISPATCH_PROTOCOL;
+
+/**
+  Register a child MMI source dispatch function for the specified software MMI.
+
+  This service registers a function (DispatchFunction) which will be called when the software 
+  MMI source specified by RegisterContext->SwMmiCpuIndex is detected. On return, 
+  DispatchHandle contains a unique handle which may be used later to unregister the function 
+  using UnRegister().
+
+  @param[in]  This                 Pointer to the EFI_MM_SW_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction     Function to register for handler when the specified software 
+                                   MMI is generated. 
+  @param[in, out] RegisterContext  Pointer to the dispatch function's context.
+                                   The caller fills this context in before calling
+                                   the register function to indicate to the register
+                                   function which Software MMI input value the
+                                   dispatch function should be invoked for.
+  @param[out] DispatchHandle       Handle generated by the dispatcher to track the
+                                   function instance.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW MMI input value
+                                 is not within a valid range or is already in use.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this
+                                 child.
+  @retval EFI_OUT_OF_RESOURCES   A unique software MMI value could not be assigned
+                                 for this dispatch.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_SW_REGISTER)(
+  IN  CONST EFI_MM_SW_DISPATCH_PROTOCOL  *This,
+  IN        EFI_MM_HANDLER_ENTRY_POINT   DispatchFunction,
+  IN  OUT   EFI_MM_SW_REGISTER_CONTEXT   *RegisterContext,
+  OUT       EFI_HANDLE                   *DispatchHandle
+  );
+
+/**
+  Unregister a child MMI source dispatch function for the specified software MMI.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called in response to a software MMI.
+
+  @param[in] This                Pointer to the EFI_MM_SW_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchHandle      Handle of dispatch function to deregister.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully unregistered.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_SW_UNREGISTER)(
+  IN CONST EFI_MM_SW_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                   DispatchHandle
+);
+
+///
+/// Interface structure for the MM Software MMI Dispatch Protocol.
+///
+/// The EFI_MM_SW_DISPATCH2_PROTOCOL provides the ability to install child handlers for the 
+/// given software.  These handlers will respond to software interrupts, and the maximum software 
+/// interrupt in the EFI_MM_SW_REGISTER_CONTEXT is denoted by MaximumSwiValue.
+///
+struct _EFI_MM_SW_DISPATCH_PROTOCOL {
+  EFI_MM_SW_REGISTER    Register;
+  EFI_MM_SW_UNREGISTER  UnRegister;
+  ///
+  /// A read-only field that describes the maximum value that can be used in the 
+  /// EFI_MM_SW_DISPATCH_PROTOCOL.Register() service.
+  ///
+  UINTN                 MaximumSwiValue;
+};
+
+extern EFI_GUID gEfiMmSwDispatchProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmSxDispatch.h b/MdePkg/Include/Protocol/MmSxDispatch.h
new file mode 100644
index 0000000..af63389
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmSxDispatch.h
@@ -0,0 +1,135 @@
+/** @file
+  MM Sx Dispatch Protocol as defined in PI 1.2 Specification
+  Volume 4 Management Mode Core Interface.
+
+  Provides the parent dispatch service for a given Sx-state source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_SX_DISPATCH_H_
+#define _MM_SX_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_SX_DISPATCH_PROTOCOL_GUID \
+  { \
+    0x456d2859, 0xa84b, 0x4e47, {0xa2, 0xee, 0x32, 0x76, 0xd8, 0x86, 0x99, 0x7d } \
+  }
+
+///
+/// Sleep states S0-S5
+///
+typedef enum {
+  SxS0,
+  SxS1,
+  SxS2,
+  SxS3,
+  SxS4,
+  SxS5,
+  EfiMaximumSleepType
+} EFI_SLEEP_TYPE;
+
+///
+/// Sleep state phase: entry or exit
+///
+typedef enum {
+  SxEntry,
+  SxExit,
+  EfiMaximumPhase
+} EFI_SLEEP_PHASE;
+
+///
+/// The dispatch function's context
+///
+typedef struct {
+  EFI_SLEEP_TYPE  Type;
+  EFI_SLEEP_PHASE Phase;
+} EFI_MM_SX_REGISTER_CONTEXT;
+
+typedef struct _EFI_MM_SX_DISPATCH_PROTOCOL  EFI_MM_SX_DISPATCH_PROTOCOL;
+
+/**
+  Provides the parent dispatch service for a given Sx source generator.
+
+  This service registers a function (DispatchFunction) which will be called when the sleep state 
+  event specified by RegisterContext is detected. On return, DispatchHandle contains a 
+  unique handle which may be used later to unregister the function using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer and CommBufferSize set to 
+  NULL and 0 respectively.
+
+  @param[in] This                Pointer to the EFI_MM_SX_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchFunction    Function to register for handler when the specified sleep state event occurs.
+  @param[in] RegisterContext     Pointer to the dispatch function's context.
+                                 The caller fills this context in before calling
+                                 the register function to indicate to the register
+                                 function which Sx state type and phase the caller
+                                 wishes to be called back on. For this intertace,
+                                 the Sx driver will call the registered handlers for
+                                 all Sx type and phases, so the Sx state handler(s)
+                                 must check the Type and Phase field of the Dispatch
+                                 context and act accordingly.
+  @param[out]  DispatchHandle    Handle of dispatch function, for when interfacing
+                                 with the parent Sx state MM driver.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_UNSUPPORTED        The Sx driver or hardware does not support that
+                                 Sx Type/Phase.
+  @retval EFI_DEVICE_ERROR       The Sx driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. Type & Phase are not
+                                 within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this
+                                 child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_SX_REGISTER)(
+  IN  CONST EFI_MM_SX_DISPATCH_PROTOCOL  *This,
+  IN        EFI_MM_HANDLER_ENTRY_POINT   DispatchFunction,
+  IN  CONST EFI_MM_SX_REGISTER_CONTEXT   *RegisterContext,
+  OUT       EFI_HANDLE                   *DispatchHandle
+  );
+
+/**
+  Unregisters an Sx-state service.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called in response to sleep event.
+
+  @param[in] This                Pointer to the EFI_MM_SX_DISPATCH_PROTOCOL instance.
+  @param[in] DispatchHandle      Handle of the service to remove. 
+
+  @retval EFI_SUCCESS            The service has been successfully removed.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_SX_UNREGISTER)(
+  IN CONST EFI_MM_SX_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                   DispatchHandle
+  );
+
+///
+/// Interface structure for the MM Sx Dispatch Protocol
+///
+/// The EFI_MM_SX_DISPATCH_PROTOCOL provides the ability to install child handlers to 
+/// respond to sleep state related events.
+///
+struct _EFI_MM_SX_DISPATCH_PROTOCOL {
+  EFI_MM_SX_REGISTER    Register;
+  EFI_MM_SX_UNREGISTER  UnRegister;
+};
+
+extern EFI_GUID gEfiMmSxDispatchProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/MmUsbDispatch.h b/MdePkg/Include/Protocol/MmUsbDispatch.h
new file mode 100644
index 0000000..0b4fabe
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmUsbDispatch.h
@@ -0,0 +1,130 @@
+/** @file
+  MM USB Dispatch Protocol as defined in PI 1.1 Specification
+  Volume 4 Management Mode Core Interface.
+
+  Provides the parent dispatch service for the USB MMI source generator.
+
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  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
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.1.
+
+**/
+
+#ifndef _MM_USB_DISPATCH_H_
+#define _MM_USB_DISPATCH_H_
+
+#include <Pi/PiMmCis.h>
+
+#define EFI_MM_USB_DISPATCH_PROTOCOL_GUID \
+  { \
+    0xee9b8d90, 0xc5a6, 0x40a2, {0xbd, 0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc, 0xa1 } \
+  }
+
+///
+/// USB MMI event types
+///
+typedef enum {
+  UsbLegacy,
+  UsbWake
+} EFI_USB_MMI_TYPE;
+
+///
+/// The dispatch function's context.
+///
+typedef struct {
+  ///
+  /// Describes whether this child handler will be invoked in response to a USB legacy 
+  /// emulation event, such as port-trap on the PS/2* keyboard control registers, or to a 
+  /// USB wake event, such as resumption from a sleep state.
+  ///
+  EFI_USB_MMI_TYPE          Type;
+  ///
+  /// The device path is part of the context structure and describes the location of the 
+  /// particular USB host controller in the system for which this register event will occur.
+  /// This location is important because of the possible integration of several USB host 
+  /// controllers in a system.
+  ///
+  EFI_DEVICE_PATH_PROTOCOL  *Device;
+} EFI_MM_USB_REGISTER_CONTEXT;
+
+typedef struct _EFI_MM_USB_DISPATCH_PROTOCOL EFI_MM_USB_DISPATCH_PROTOCOL;
+
+/**
+  Provides the parent dispatch service for the USB MMI source generator.
+
+  This service registers a function (DispatchFunction) which will be called when the USB-
+  related MMI specified by RegisterContext has occurred. On return, DispatchHandle 
+  contains a unique handle which may be used later to unregister the function using UnRegister().
+  The DispatchFunction will be called with Context set to the same value as was passed into 
+  this function in RegisterContext and with CommBuffer containing NULL and 
+  CommBufferSize containing zero.
+
+  @param[in]  This               Pointer to the EFI_MM_USB_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchFunction   Function to register for handler when a USB-related MMI occurs. 
+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
+                                 The caller fills this context in before calling
+                                 the register function to indicate to the register
+                                 function the USB MMI types for which the dispatch
+                                 function should be invoked.
+  @param[out] DispatchHandle     Handle generated by the dispatcher to track the function instance.
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 registered and the MMI source has been enabled.
+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The USB MMI type
+                                 is not within valid range.
+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_USB_REGISTER)(
+  IN  CONST EFI_MM_USB_DISPATCH_PROTOCOL  *This,
+  IN        EFI_MM_HANDLER_ENTRY_POINT    DispatchFunction,
+  IN  CONST EFI_MM_USB_REGISTER_CONTEXT   *RegisterContext,
+  OUT       EFI_HANDLE                    *DispatchHandle
+  );
+
+/**
+  Unregisters a USB service.
+
+  This service removes the handler associated with DispatchHandle so that it will no longer be 
+  called when the USB event occurs.
+
+  @param[in]  This               Pointer to the EFI_MM_USB_DISPATCH_PROTOCOL instance.
+  @param[in]  DispatchHandle     Handle of the service to remove. 
+
+  @retval EFI_SUCCESS            The dispatch function has been successfully
+                                 unregistered and the MMI source has been disabled
+                                 if there are no other registered child dispatch
+                                 functions for this MMI source.
+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_USB_UNREGISTER)(
+  IN CONST EFI_MM_USB_DISPATCH_PROTOCOL  *This,
+  IN       EFI_HANDLE                    DispatchHandle
+  );
+
+///
+/// Interface structure for the MM USB MMI Dispatch Protocol
+///
+/// This protocol provides the parent dispatch service for the USB MMI source generator.
+///
+struct _EFI_MM_USB_DISPATCH_PROTOCOL {
+  EFI_MM_USB_REGISTER    Register;
+  EFI_MM_USB_UNREGISTER  UnRegister;
+};
+
+extern EFI_GUID gEfiMmUsbDispatchProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index f54b056..ace4df3 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -1033,6 +1033,9 @@
   ## Include/Protocol/SmmReportStatusCodeHandler.h
   gEfiSmmRscHandlerProtocolGuid   = { 0x2ff29fa7, 0x5e80, 0x4ed9, { 0xb3, 0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4 }}
 
+  ## Include/Protocol/MmReportStatusCodeHandler.h
+  gEfiMmRscHandlerProtocolGuid   = { 0x2ff29fa7, 0x5e80, 0x4ed9, { 0xb3, 0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4 }}
+
   ## Include/Protocol/AcpiSystemDescriptionTable.h
   gEfiAcpiSdtProtocolGuid         = { 0xeb97088e, 0xcfdf, 0x49c6, { 0xbe, 0x4b, 0xd9, 0x6, 0xa5, 0xb2, 0xe, 0x86 }}
 
@@ -1042,60 +1045,117 @@
   ## Include/Protocol/SmmCpuIo2.h
   gEfiSmmCpuIo2ProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d, 0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}
 
+  ## Include/Protocol/MmCpuIo.h
+  gEfiMmCpuIoProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d, 0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}
+
   ## Include/Protocol/SmmBase2.h
   gEfiSmmBase2ProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}
 
+  ## Include/Protocol/MmBase.h
+  gEfiMmBaseProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}
+
   ## Include/Protocol/SmmAccess2.h
   gEfiSmmAccess2ProtocolGuid      = { 0xc2702b74, 0x800c, 0x4131, { 0x87, 0x46, 0x8f, 0xb5, 0xb8, 0x9c, 0xe4, 0xac }}
 
+  ## Include/Protocol/MmAccess.h
+  gEfiMmAccessProtocolGuid      = { 0xc2702b74, 0x800c, 0x4131, { 0x87, 0x46, 0x8f, 0xb5, 0xb8, 0x9c, 0xe4, 0xac }}
+
   ## Include/Protocol/SmmControl2.h
   gEfiSmmControl2ProtocolGuid     = { 0x843dc720, 0xab1e, 0x42cb, { 0x93, 0x57, 0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}}
 
+  ## Include/Protocol/MmControl.h
+  gEfiMmControlProtocolGuid     = { 0x843dc720, 0xab1e, 0x42cb, { 0x93, 0x57, 0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}}
+
   ## Include/Protocol/SmmConfiguration.h
   gEfiSmmConfigurationProtocolGuid= { 0x26eeb3de, 0xb689, 0x492e, { 0x80, 0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b, 0xa7 }}
 
+  ## Include/Protocol/MmConfiguration.h
+  gEfiMmConfigurationProtocolGuid= { 0x26eeb3de, 0xb689, 0x492e, { 0x80, 0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b, 0xa7 }}
+
   ## Include/Protocol/SmmReadyToLock.h
   gEfiSmmReadyToLockProtocolGuid  = { 0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82, 0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 }}
 
+  ## Include/Protocol/MmReadyToLock.h
+  gEfiMmReadyToLockProtocolGuid  = { 0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82, 0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 }}
+
   ## Include/Protocol/DxeSmmReadyToLock.h
   gEfiDxeSmmReadyToLockProtocolGuid = { 0x60ff8964, 0xe906, 0x41d0, { 0xaf, 0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0, 0x8e }}
 
+  ## Include/Protocol/DxeMmReadyToLock.h
+  gEfiDxeMmReadyToLockProtocolGuid = { 0x60ff8964, 0xe906, 0x41d0, { 0xaf, 0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0, 0x8e }}
+
   ## Include/Protocol/SmmCommunication.h
   gEfiSmmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
 
+  ## Include/Protocol/MmCommunication.h
+  gEfiMmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
+
   ## Include/Protocol/SmmStatusCode.h
   gEfiSmmStatusCodeProtocolGuid   = { 0x6afd2b77, 0x98c1, 0x4acd, { 0xa6, 0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}}
 
+  ## Include/Protocol/MmStatusCode.h
+  gEfiMmStatusCodeProtocolGuid   = { 0x6afd2b77, 0x98c1, 0x4acd, { 0xa6, 0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}}
+
   ## Include/Protocol/SmmCpu.h
   gEfiSmmCpuProtocolGuid          = { 0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22, 0xf8, 0xe9, 0x2b, 0xb3, 0xd5, 0x69 }}
 
+  ## Include/Protocol/MmCpu.h
+  gEfiMmCpuProtocolGuid          = { 0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22, 0xf8, 0xe9, 0x2b, 0xb3, 0xd5, 0x69 }}
+
   ## Include/Protocol/SmmPciRootBridgeIo.h
   gEfiSmmPciRootBridgeIoProtocolGuid = { 0x8bc1714d, 0xffcb, 0x41c3, { 0x89, 0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98, 0xea }}
 
+  ## Include/Protocol/MmPciRootBridgeIo.h
+  gEfiMmPciRootBridgeIoProtocolGuid = { 0x8bc1714d, 0xffcb, 0x41c3, { 0x89, 0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98, 0xea }}
+
   ## Include/Protocol/SmmSwDispatch2.h
   gEfiSmmSwDispatch2ProtocolGuid  = { 0x18a3c6dc, 0x5eea, 0x48c8, {0xa1, 0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 }}
 
+  ## Include/Protocol/MmSwDispatch.h
+  gEfiMmSwDispatchProtocolGuid  = { 0x18a3c6dc, 0x5eea, 0x48c8, {0xa1, 0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 }}
+
   ## Include/Protocol/SmmSxDispatch2.h
   gEfiSmmSxDispatch2ProtocolGuid  = { 0x456d2859, 0xa84b, 0x4e47, {0xa2, 0xee, 0x32, 0x76, 0xd8, 0x86, 0x99, 0x7d }}
 
+  ## Include/Protocol/MmSxDispatch.h
+  gEfiMmSxDispatchProtocolGuid  = { 0x456d2859, 0xa84b, 0x4e47, {0xa2, 0xee, 0x32, 0x76, 0xd8, 0x86, 0x99, 0x7d }}
+
   ## Include/Protocol/SmmPeriodicTimerDispatch2.h
   gEfiSmmPeriodicTimerDispatch2ProtocolGuid = { 0x4cec368e, 0x8e8e, 0x4d71, {0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a, 0x53 }}
 
+  ## Include/Protocol/MmPeriodicTimerDispatch.h
+  gEfiMmPeriodicTimerDispatchProtocolGuid = { 0x4cec368e, 0x8e8e, 0x4d71, {0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a, 0x53 }}
+
   ## Include/Protocol/SmmUsbDispatch2.h
   gEfiSmmUsbDispatch2ProtocolGuid = { 0xee9b8d90, 0xc5a6, 0x40a2, {0xbd, 0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc, 0xa1 }}
 
+  ## Include/Protocol/MmUsbDispatch.h
+  gEfiMmUsbDispatchProtocolGuid = { 0xee9b8d90, 0xc5a6, 0x40a2, {0xbd, 0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc, 0xa1 }}
+
   ## Include/Protocol/SmmGpiDispatch2.h
   gEfiSmmGpiDispatch2ProtocolGuid = { 0x25566b03, 0xb577, 0x4cbf, {0x95, 0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43, 0x80 }}
 
+  ## Include/Protocol/MmGpiDispatch.h
+  gEfiMmGpiDispatchProtocolGuid = { 0x25566b03, 0xb577, 0x4cbf, {0x95, 0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43, 0x80 }}
+
   ## Include/Protocol/SmmStandbyButtonDispatch2.h
   gEfiSmmStandbyButtonDispatch2ProtocolGuid = { 0x7300c4a1, 0x43f2, 0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b }}
 
+  ## Include/Protocol/MmStandbyButtonDispatch.h
+  gEfiMmStandbyButtonDispatchProtocolGuid = { 0x7300c4a1, 0x43f2, 0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b }}
+
   ## Include/Protocol/SmmPowerButtonDispatch2.h
   gEfiSmmPowerButtonDispatch2ProtocolGuid = { 0x1b1183fa, 0x1823, 0x46a7, {0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d }}
 
+  ## Include/Protocol/MmPowerButtonDispatch.h
+  gEfiMmPowerButtonDispatchProtocolGuid = { 0x1b1183fa, 0x1823, 0x46a7, {0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d }}
+
   ## Include/Protocol/SmmIoTrapDispatch2.h
   gEfiSmmIoTrapDispatch2ProtocolGuid = { 0x58dc368d, 0x7bfa, 0x4e77, {0xab, 0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 }}
 
+  ## Include/Protocol/MmIoTrapDispatch.h
+  gEfiMmIoTrapDispatchProtocolGuid = { 0x58dc368d, 0x7bfa, 0x4e77, {0xab, 0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 }}
+
   ## Include/Protocol/PiPcd.h
   gEfiPcdProtocolGuid = { 0x13a3f0f6, 0x264a, 0x3ef0, { 0xf2, 0xe0, 0xde, 0xc5, 0x12, 0x34, 0x2f, 0x34 } }
 
@@ -1141,6 +1201,9 @@
   ## Include/Protocol/SmmEndOfDxe.h
   gEfiSmmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
 
+  ## Include/Protocol/MmEndOfDxe.h
+  gEfiMmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
+
   ## Include/Protocol/IsaHc.h
   gEfiIsaHcProtocolGuid               = { 0xbcdaf080, 0x1bde, 0x4e22, {0xae, 0x6a, 0x43, 0x54, 0x1e, 0x12, 0x8e, 0xc4 } }
   gEfiIsaHcServiceBindingProtocolGuid = { 0xfad7933a, 0x6c21, 0x4234, {0xa4, 0x34, 0x0a, 0x8a, 0x0d, 0x2b, 0x07, 0x81 } }
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch 1/2] MdePkg: Add new definitions for Management Mode.
Posted by Gao, Liming 7 years, 4 months ago
Eric:
  I have two comments. 
1) New ppi/protocol should be placed below PI1.6 comment in MdePkg.dec
2) MdePkg\Include\Pi\PiMmCis.h still has SMM word in description. It should use MM instead of SMM. 

Thanks
Liming
>-----Original Message-----
>From: Dong, Eric
>Sent: Monday, August 14, 2017 4:33 PM
>To: edk2-devel@lists.01.org
>Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Gao, Liming
><liming.gao@intel.com>
>Subject: [Patch 1/2] MdePkg: Add new definitions for Management Mode.
>
>In PI 1.5 version, system management mode name(SMM) has been changed
>to Management Mode(MM). It impacts the current code which still use
>SMM/Smram/SMI keywords. This patch add new definition which use
>MM/MmRam/MMI keywords to follow new spec definitions.
>
>Cc: Michael D Kinney <michael.d.kinney@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Eric Dong <eric.dong@intel.com>
>---
> MdePkg/Include/Pi/PiMmCis.h                        | 350 +++++++++++++++++++++
> MdePkg/Include/PiMm.h                              |  25 ++
> MdePkg/Include/Protocol/DxeMmReadyToLock.h         |  41 +++
> MdePkg/Include/Protocol/MmAccess.h                 | 133 ++++++++
> MdePkg/Include/Protocol/MmBase.h                   |  87 +++++
> MdePkg/Include/Protocol/MmCommunication.h          |  83 +++++
> MdePkg/Include/Protocol/MmConfiguration.h          |  86 +++++
> MdePkg/Include/Protocol/MmControl.h                | 106 +++++++
> MdePkg/Include/Protocol/MmCpu.h                    | 247 +++++++++++++++
> MdePkg/Include/Protocol/MmCpuIo.h                  |  96 ++++++
> MdePkg/Include/Protocol/MmEndOfDxe.h               |  33 ++
> MdePkg/Include/Protocol/MmGpiDispatch.h            | 125 ++++++++
> MdePkg/Include/Protocol/MmIoTrapDispatch.h         | 136 ++++++++
> MdePkg/Include/Protocol/MmPciRootBridgeIo.h        |  37 +++
> MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h  | 170 ++++++++++
> MdePkg/Include/Protocol/MmPowerButtonDispatch.h    | 117 +++++++
> MdePkg/Include/Protocol/MmReadyToLock.h            |  35 +++
> .../Include/Protocol/MmReportStatusCodeHandler.h   |  81 +++++
> MdePkg/Include/Protocol/MmStandbyButtonDispatch.h  | 119 +++++++
> MdePkg/Include/Protocol/MmStatusCode.h             |  65 ++++
> MdePkg/Include/Protocol/MmSwDispatch.h             | 136 ++++++++
> MdePkg/Include/Protocol/MmSxDispatch.h             | 135 ++++++++
> MdePkg/Include/Protocol/MmUsbDispatch.h            | 130 ++++++++
> MdePkg/MdePkg.dec                                  |  63 ++++
> 24 files changed, 2636 insertions(+)
> create mode 100644 MdePkg/Include/Pi/PiMmCis.h
> create mode 100644 MdePkg/Include/PiMm.h
> create mode 100644 MdePkg/Include/Protocol/DxeMmReadyToLock.h
> create mode 100644 MdePkg/Include/Protocol/MmAccess.h
> create mode 100644 MdePkg/Include/Protocol/MmBase.h
> create mode 100644 MdePkg/Include/Protocol/MmCommunication.h
> create mode 100644 MdePkg/Include/Protocol/MmConfiguration.h
> create mode 100644 MdePkg/Include/Protocol/MmControl.h
> create mode 100644 MdePkg/Include/Protocol/MmCpu.h
> create mode 100644 MdePkg/Include/Protocol/MmCpuIo.h
> create mode 100644 MdePkg/Include/Protocol/MmEndOfDxe.h
> create mode 100644 MdePkg/Include/Protocol/MmGpiDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmIoTrapDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmPciRootBridgeIo.h
> create mode 100644 MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmPowerButtonDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmReadyToLock.h
> create mode 100644
>MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
> create mode 100644 MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmStatusCode.h
> create mode 100644 MdePkg/Include/Protocol/MmSwDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmSxDispatch.h
> create mode 100644 MdePkg/Include/Protocol/MmUsbDispatch.h
>
>diff --git a/MdePkg/Include/Pi/PiMmCis.h b/MdePkg/Include/Pi/PiMmCis.h
>new file mode 100644
>index 0000000..6f41fa9
>--- /dev/null
>+++ b/MdePkg/Include/Pi/PiMmCis.h
>@@ -0,0 +1,350 @@
>+/** @file
>+  Common definitions in the Platform Initialization Specification version 1.6
>+  VOLUME 4 Management Mode Core Interface version.
>+
>+  Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _PI_MMCIS_H_
>+#define _PI_MMCIS_H_
>+
>+#include <Protocol/MmCpuIo.h>
>+
>+typedef struct _EFI_MM_SYSTEM_TABLE  EFI_MM_SYSTEM_TABLE;
>+
>+///
>+/// The Management Mode System Table (MMST) signature
>+///
>+#define MM_MMST_SIGNATURE            SIGNATURE_32 ('S', 'M', 'S', 'T')
>+///
>+/// The Management Mode System Table (MMST) revision is 1.6
>+///
>+#define MM_SPECIFICATION_MAJOR_REVISION  1
>+#define MM_SPECIFICATION_MINOR_REVISION  60
>+#define EFI_MM_SYSTEM_TABLE_REVISION
>((MM_SPECIFICATION_MAJOR_REVISION<<16) |
>(MM_SPECIFICATION_MINOR_REVISION))
>+
>+/**
>+  Adds, updates, or removes a configuration table entry from the
>Management Mode System Table.
>+
>+  The MmInstallConfigurationTable() function is used to maintain the list
>+  of configuration tables that are stored in the Management Mode System
>+  Table.  The list is stored as an array of (GUID, Pointer) pairs.  The list
>+  must be allocated from pool memory with PoolType set to
>EfiRuntimeServicesData.
>+
>+  @param[in] SystemTable         A pointer to the MM System Table (MMST).
>+  @param[in] Guid                A pointer to the GUID for the entry to add, update,
>or remove.
>+  @param[in] Table               A pointer to the buffer of the table to add.
>+  @param[in] TableSize           The size of the table to install.
>+
>+  @retval EFI_SUCCESS            The (Guid, Table) pair was added, updated, or
>removed.
>+  @retval EFI_INVALID_PARAMETER  Guid is not valid.
>+  @retval EFI_NOT_FOUND          An attempt was made to delete a non-
>existent entry.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory available
>to complete the operation.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_INSTALL_CONFIGURATION_TABLE)(
>+  IN CONST EFI_MM_SYSTEM_TABLE    *SystemTable,
>+  IN CONST EFI_GUID               *Guid,
>+  IN VOID                         *Table,
>+  IN UINTN                        TableSize
>+  );
>+
>+/**
>+  This service lets the caller to get one distinct application processor (AP) to
>execute
>+  a caller-provided code stream while in MM.
>+
>+  @param[in]     Procedure       A pointer to the code stream to be run on the
>designated
>+                                 AP of the system.
>+  @param[in]     CpuNumber       The zero-based index of the processor
>number of the AP
>+                                 on which the code stream is supposed to run.
>+  @param[in,out] ProcArguments   Allows the caller to pass a list of
>parameters to the code
>+                                 that is run by the AP.
>+
>+  @retval EFI_SUCCESS            The call was successful and the return
>parameters are valid.
>+  @retval EFI_INVALID_PARAMETER  The input arguments are out of range.
>+  @retval EFI_INVALID_PARAMETER  The CPU requested is not available on
>this SMI invocation.
>+  @retval EFI_INVALID_PARAMETER  The CPU cannot support an additional
>service invocation.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_STARTUP_THIS_AP)(
>+  IN EFI_AP_PROCEDURE  Procedure,
>+  IN UINTN             CpuNumber,
>+  IN OUT VOID          *ProcArguments OPTIONAL
>+  );
>+
>+/**
>+  Function prototype for protocol install notification.
>+
>+  @param[in] Protocol   Points to the protocol's unique identifier.
>+  @param[in] Interface  Points to the interface instance.
>+  @param[in] Handle     The handle on which the interface was installed.
>+
>+  @return Status Code
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_NOTIFY_FN)(
>+  IN CONST EFI_GUID  *Protocol,
>+  IN VOID            *Interface,
>+  IN EFI_HANDLE      Handle
>+  );
>+
>+/**
>+  Register a callback function be called when a particular protocol interface is
>installed.
>+
>+  The MmRegisterProtocolNotify() function creates a registration Function
>that is to be
>+  called whenever a protocol interface is installed for Protocol by
>+  MmInstallProtocolInterface().
>+  If Function == NULL and Registration is an existing registration, then the
>callback is unhooked.
>+
>+  @param[in]  Protocol          The unique ID of the protocol for which the event
>is to be registered.
>+  @param[in]  Function          Points to the notification function.
>+  @param[out] Registration      A pointer to a memory location to receive the
>registration value.
>+
>+  @retval EFI_SUCCESS           Successfully returned the registration record
>+                                that has been added or unhooked.
>+  @retval EFI_INVALID_PARAMETER Protocol is NULL or Registration is NULL.
>+  @retval EFI_OUT_OF_RESOURCES  Not enough memory resource to finish
>the request.
>+  @retval EFI_NOT_FOUND         If the registration is not found when Function
>== NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_REGISTER_PROTOCOL_NOTIFY)(
>+  IN  CONST EFI_GUID     *Protocol,
>+  IN  EFI_MM_NOTIFY_FN   Function,
>+  OUT VOID               **Registration
>+  );
>+
>+/**
>+  Manage MMI of a particular type.
>+
>+  @param[in]     HandlerType     Points to the handler type or NULL for root
>MMI handlers.
>+  @param[in]     Context         Points to an optional context buffer.
>+  @param[in,out] CommBuffer      Points to the optional communication
>buffer.
>+  @param[in,out] CommBufferSize  Points to the size of the optional
>communication buffer.
>+
>+  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING  Interrupt source was
>processed successfully but not quiesced.
>+  @retval EFI_INTERRUPT_PENDING              One or more SMI sources could
>not be quiesced.
>+  @retval EFI_NOT_FOUND                      Interrupt source was not handled or
>quiesced.
>+  @retval EFI_SUCCESS                        Interrupt source was handled and
>quiesced.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_INTERRUPT_MANAGE)(
>+  IN CONST EFI_GUID  *HandlerType,
>+  IN CONST VOID      *Context         OPTIONAL,
>+  IN OUT VOID        *CommBuffer      OPTIONAL,
>+  IN OUT UINTN       *CommBufferSize  OPTIONAL
>+  );
>+
>+/**
>+  Main entry point for an MM handler dispatch or communicate-based
>callback.
>+
>+  @param[in]     DispatchHandle  The unique handle assigned to this handler
>by MmiHandlerRegister().
>+  @param[in]     Context         Points to an optional handler context which was
>specified when the
>+                                 handler was registered.
>+  @param[in,out] CommBuffer      A pointer to a collection of data in memory
>that will
>+                                 be conveyed from a non-MM environment into an MM
>environment.
>+  @param[in,out] CommBufferSize  The size of the CommBuffer.
>+
>+  @retval EFI_SUCCESS                         The interrupt was handled and quiesced.
>No other handlers
>+                                              should still be called.
>+  @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED  The interrupt has
>been quiesced but other handlers should
>+                                              still be called.
>+  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING   The interrupt is still
>pending and other handlers should still
>+                                              be called.
>+  @retval EFI_INTERRUPT_PENDING               The interrupt could not be
>quiesced.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_HANDLER_ENTRY_POINT)(
>+  IN EFI_HANDLE  DispatchHandle,
>+  IN CONST VOID  *Context         OPTIONAL,
>+  IN OUT VOID    *CommBuffer      OPTIONAL,
>+  IN OUT UINTN   *CommBufferSize  OPTIONAL
>+  );
>+
>+/**
>+  Registers a handler to execute within MM.
>+
>+  @param[in]  Handler            Handler service function pointer.
>+  @param[in]  HandlerType        Points to the handler type or NULL for root
>MMI handlers.
>+  @param[out] DispatchHandle     On return, contains a unique handle which
>can be used to later
>+                                 unregister the handler function.
>+
>+  @retval EFI_SUCCESS            MMI handler added successfully.
>+  @retval EFI_INVALID_PARAMETER  Handler is NULL or DispatchHandle is
>NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_INTERRUPT_REGISTER)(
>+  IN  EFI_MM_HANDLER_ENTRY_POINT    Handler,
>+  IN  CONST EFI_GUID                *HandlerType OPTIONAL,
>+  OUT EFI_HANDLE                    *DispatchHandle
>+  );
>+
>+/**
>+  Unregister a handler in MM.
>+
>+  @param[in] DispatchHandle      The handle that was specified when the
>handler was registered.
>+
>+  @retval EFI_SUCCESS            Handler function was successfully unregistered.
>+  @retval EFI_INVALID_PARAMETER  DispatchHandle does not refer to a valid
>handle.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_INTERRUPT_UNREGISTER)(
>+  IN EFI_HANDLE  DispatchHandle
>+  );
>+
>+///
>+/// Processor information and functionality needed by MM Foundation.
>+///
>+typedef struct _EFI_MM_ENTRY_CONTEXT {
>+  EFI_MM_STARTUP_THIS_AP   MmStartupThisAp;
>+  ///
>+  /// A number between zero and the NumberOfCpus field. This field
>designates which
>+  /// processor is executing the SMM Foundation.
>+  ///
>+  UINTN                    CurrentlyExecutingCpu;
>+  ///
>+  /// The number of possible processors in the platform.  This is a 1 based
>+  /// counter.  This does not indicate the number of processors that entered
>SMM.
>+  ///
>+  UINTN                    NumberOfCpus;
>+  ///
>+  /// Points to an array, where each element describes the number of bytes
>in the
>+  /// corresponding save state specified by CpuSaveState. There are always
>+  /// NumberOfCpus entries in the array.
>+  ///
>+  UINTN                    *CpuSaveStateSize;
>+  ///
>+  /// Points to an array, where each element is a pointer to a CPU save state.
>The
>+  /// corresponding element in CpuSaveStateSize specifies the number of
>bytes in the
>+  /// save state area. There are always NumberOfCpus entries in the array.
>+  ///
>+  VOID                     **CpuSaveState;
>+} EFI_MM_ENTRY_CONTEXT;
>+
>+/**
>+  This function is the main entry point to the MM Foundation.
>+
>+  @param[in] MmEntryContext  Processor information and functionality
>needed by MM Foundation.
>+**/
>+typedef
>+VOID
>+(EFIAPI *EFI_MM_ENTRY_POINT)(
>+  IN CONST EFI_MM_ENTRY_CONTEXT  *MmEntryContext
>+  );
>+
>+///
>+/// Management Mode System Table (MMST)
>+///
>+/// The Management Mode System Table (MMST) is a table that contains a
>collection of common
>+/// services for managing MMRAM allocation and providing basic I/O services.
>These services are
>+/// intended for both preboot and runtime usage.
>+///
>+struct _EFI_MM_SYSTEM_TABLE {
>+  ///
>+  /// The table header for the SMST.
>+  ///
>+  EFI_TABLE_HEADER                     Hdr;
>+  ///
>+  /// A pointer to a NULL-terminated Unicode string containing the vendor
>name.
>+  /// It is permissible for this pointer to be NULL.
>+  ///
>+  CHAR16                               *MmFirmwareVendor;
>+  ///
>+  /// The particular revision of the firmware.
>+  ///
>+  UINT32                               MmFirmwareRevision;
>+
>+  EFI_MM_INSTALL_CONFIGURATION_TABLE   MmInstallConfigurationTable;
>+
>+  ///
>+  /// I/O Service
>+  ///
>+  EFI_MM_CPU_IO_PROTOCOL               MmIo;
>+
>+  ///
>+  /// Runtime memory services
>+  ///
>+  EFI_ALLOCATE_POOL                    MmAllocatePool;
>+  EFI_FREE_POOL                        MmFreePool;
>+  EFI_ALLOCATE_PAGES                   MmAllocatePages;
>+  EFI_FREE_PAGES                       MmFreePages;
>+
>+  ///
>+  /// MP service
>+  ///
>+  EFI_MM_STARTUP_THIS_AP               MmStartupThisAp;
>+
>+  ///
>+  /// CPU information records
>+  ///
>+
>+  ///
>+  /// A number between zero and and the NumberOfCpus field. This field
>designates
>+  /// which processor is executing the SMM infrastructure.
>+  ///
>+  UINTN                                CurrentlyExecutingCpu;
>+  ///
>+  /// The number of possible processors in the platform.  This is a 1 based
>counter.
>+  ///
>+  UINTN                                NumberOfCpus;
>+  ///
>+  /// Points to an array, where each element describes the number of bytes
>in the
>+  /// corresponding save state specified by CpuSaveState. There are always
>+  /// NumberOfCpus entries in the array.
>+  ///
>+  UINTN                                *CpuSaveStateSize;
>+  ///
>+  /// Points to an array, where each element is a pointer to a CPU save state.
>The
>+  /// corresponding element in CpuSaveStateSize specifies the number of
>bytes in the
>+  /// save state area. There are always NumberOfCpus entries in the array.
>+  ///
>+  VOID                                 **CpuSaveState;
>+
>+  ///
>+  /// Extensibility table
>+  ///
>+
>+  ///
>+  /// The number of UEFI Configuration Tables in the buffer
>SmmConfigurationTable.
>+  ///
>+  UINTN                                NumberOfTableEntries;
>+  ///
>+  /// A pointer to the UEFI Configuration Tables. The number of entries in the
>table is
>+  /// NumberOfTableEntries.
>+  ///
>+  EFI_CONFIGURATION_TABLE              *MmConfigurationTable;
>+
>+  ///
>+  /// Protocol services
>+  ///
>+  EFI_INSTALL_PROTOCOL_INTERFACE       MmInstallProtocolInterface;
>+  EFI_UNINSTALL_PROTOCOL_INTERFACE     MmUninstallProtocolInterface;
>+  EFI_HANDLE_PROTOCOL                  MmHandleProtocol;
>+  EFI_MM_REGISTER_PROTOCOL_NOTIFY      MmRegisterProtocolNotify;
>+  EFI_LOCATE_HANDLE                    MmLocateHandle;
>+  EFI_LOCATE_PROTOCOL                  MmLocateProtocol;
>+
>+  ///
>+  /// MMI Management functions
>+  ///
>+  EFI_MM_INTERRUPT_MANAGE              MmiManage;
>+  EFI_MM_INTERRUPT_REGISTER            MmiHandlerRegister;
>+  EFI_MM_INTERRUPT_UNREGISTER          MmiHandlerUnRegister;
>+};
>+
>+#endif
>diff --git a/MdePkg/Include/PiMm.h b/MdePkg/Include/PiMm.h
>new file mode 100644
>index 0000000..fdb7d27
>--- /dev/null
>+++ b/MdePkg/Include/PiMm.h
>@@ -0,0 +1,25 @@
>+/** @file
>+
>+  Root include file for Mde Package MM modules.
>+
>+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
>+This program and the accompanying materials are licensed and made
>available under
>+the terms and conditions of the BSD License that accompanies this
>distribution.
>+The full text of the license may be found at
>+http://opensource.org/licenses/bsd-license.php.
>+
>+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef __PI_MM_H__
>+#define __PI_MM_H__
>+
>+#include <Uefi/UefiBaseType.h>
>+#include <Uefi/UefiSpec.h>
>+
>+#include <Pi/PiMmCis.h>
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/DxeMmReadyToLock.h
>b/MdePkg/Include/Protocol/DxeMmReadyToLock.h
>new file mode 100644
>index 0000000..9101101
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/DxeMmReadyToLock.h
>@@ -0,0 +1,41 @@
>+/** @file
>+  DXE MM Ready To Lock protocol introduced in the PI 1.2 specification.
>+
>+  According to PI 1.4a specification, this UEFI protocol indicates that
>+  resources and services that should not be used by the third party code
>+  are about to be locked.
>+  This protocol is a mandatory protocol published by PI platform code.
>+  This protocol in tandem with the End of DXE Event facilitates transition
>+  of the platform from the environment where all of the components are
>+  under the authority of the platform manufacturer to the environment
>where
>+  third party extensible modules such as UEFI drivers and UEFI applications
>+  are executed. The protocol is published immediately after signaling of the
>+  End of DXE Event. PI modules that need to lock or protect their resources
>+  in anticipation of the invocation of 3rd party extensible modules should
>+  register for notification on installation of this protocol and effect the
>+  appropriate protections in their notification handlers. For example, PI
>+  platform code may choose to use notification handler to lock MM by
>invoking
>+  EFI_MM_ACCESS_PROTOCOL.Lock() function.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _DXE_MM_READY_TO_LOCK_H_
>+#define _DXE_MM_READY_TO_LOCK_H_
>+
>+#define EFI_DXE_MM_READY_TO_LOCK_PROTOCOL_GUID \
>+  { \
>+    0x60ff8964, 0xe906, 0x41d0, { 0xaf, 0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0,
>0x8e } \
>+  }
>+
>+extern EFI_GUID gEfiDxeMmReadyToLockProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmAccess.h
>b/MdePkg/Include/Protocol/MmAccess.h
>new file mode 100644
>index 0000000..b59c798
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmAccess.h
>@@ -0,0 +1,133 @@
>+/** @file
>+  EFI MM Access Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol is used to control the visibility of the MMRAM on the platform.
>+  It abstracts the location and characteristics of MMRAM.  The expectation is
>+  that the north bridge or memory controller would publish this protocol.
>+
>+  The principal functionality found in the memory controller includes the
>following:
>+  - Exposing the MMRAM to all non-MM agents, or the "open" state
>+  - Shrouding the MMRAM to all but the MM agents, or the "closed" state
>+  - Preserving the system integrity, or "locking" the MMRAM, such that the
>settings cannot be
>+    perturbed by either boot service or runtime agents
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_ACCESS_H_
>+#define _MM_ACCESS_H_
>+
>+#define EFI_MM_ACCESS_PROTOCOL_GUID \
>+  { \
>+     0xc2702b74, 0x800c, 0x4131, {0x87, 0x46, 0x8f, 0xb5, 0xb8, 0x9c, 0xe4,
>0xac } \
>+  }
>+
>+
>+typedef struct _EFI_MM_ACCESS_PROTOCOL  EFI_MM_ACCESS_PROTOCOL;
>+
>+/**
>+  Opens the MMRAM area to be accessible by a boot-service driver.
>+
>+  This function "opens" MMRAM so that it is visible while not inside of MM.
>The function should
>+  return EFI_UNSUPPORTED if the hardware does not support hiding of
>MMRAM. The function
>+  should return EFI_DEVICE_ERROR if the MMRAM configuration is locked.
>+
>+  @param[in] This           The EFI_MM_ACCESS_PROTOCOL instance.
>+
>+  @retval EFI_SUCCESS       The operation was successful.
>+  @retval EFI_UNSUPPORTED   The system does not support opening and
>closing of MMRAM.
>+  @retval EFI_DEVICE_ERROR  MMRAM cannot be opened, perhaps because
>it is locked.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_OPEN)(
>+  IN EFI_MM_ACCESS_PROTOCOL  *This
>+  );
>+
>+/**
>+  Inhibits access to the MMRAM.
>+
>+  This function "closes" MMRAM so that it is not visible while outside of MM.
>The function should
>+  return EFI_UNSUPPORTED if the hardware does not support hiding of
>MMRAM.
>+
>+  @param[in] This           The EFI_MM_ACCESS_PROTOCOL instance.
>+
>+  @retval EFI_SUCCESS       The operation was successful.
>+  @retval EFI_UNSUPPORTED   The system does not support opening and
>closing of MMRAM.
>+  @retval EFI_DEVICE_ERROR  MMRAM cannot be closed.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_CLOSE)(
>+  IN EFI_MM_ACCESS_PROTOCOL  *This
>+  );
>+
>+/**
>+  Inhibits access to the MMRAM.
>+
>+  This function prohibits access to the MMRAM region.  This function is
>usually implemented such
>+  that it is a write-once operation.
>+
>+  @param[in] This          The EFI_MM_ACCESS_PROTOCOL instance.
>+
>+  @retval EFI_SUCCESS      The device was successfully locked.
>+  @retval EFI_UNSUPPORTED  The system does not support locking of
>MMRAM.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_LOCK)(
>+  IN EFI_MM_ACCESS_PROTOCOL  *This
>+  );
>+
>+/**
>+  Queries the memory controller for the possible regions that will support
>MMRAM.
>+
>+  @param[in]     This           The EFI_MM_ACCESS_PROTOCOL instance.
>+  @param[in,out] MmramMapSize   A pointer to the size, in bytes, of the
>MmramMemoryMap buffer.
>+  @param[in,out] MmramMap       A pointer to the buffer in which firmware
>places the current memory map.
>+
>+  @retval EFI_SUCCESS           The chipset supported the given resource.
>+  @retval EFI_BUFFER_TOO_SMALL  The MmramMap parameter was too
>small.  The current buffer size
>+                                needed to hold the memory map is returned in
>MmramMapSize.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_CAPABILITIES)(
>+  IN CONST EFI_MM_ACCESS_PROTOCOL    *This,
>+  IN OUT UINTN                       *MmramMapSize,
>+  IN OUT EFI_MMRAM_DESCRIPTOR        *MmramMap
>+  );
>+
>+///
>+///  EFI MM Access Protocol is used to control the visibility of the MMRAM
>on the platform.
>+///  It abstracts the location and characteristics of MMRAM. The platform
>should report all
>+///  MMRAM via EFI_MM_ACCESS_PROTOCOL. The expectation is that the
>north bridge or memory
>+///  controller would publish this protocol.
>+///
>+struct _EFI_MM_ACCESS_PROTOCOL {
>+  EFI_MM_OPEN          Open;
>+  EFI_MM_CLOSE         Close;
>+  EFI_MM_LOCK          Lock;
>+  EFI_MM_CAPABILITIES  GetCapabilities;
>+  ///
>+  /// Indicates the current state of the MMRAM. Set to TRUE if MMRAM is
>locked.
>+  ///
>+  BOOLEAN               LockState;
>+  ///
>+  /// Indicates the current state of the MMRAM. Set to TRUE if MMRAM is
>open.
>+  ///
>+  BOOLEAN               OpenState;
>+};
>+
>+extern EFI_GUID gEfiMmAccessProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmBase.h
>b/MdePkg/Include/Protocol/MmBase.h
>new file mode 100644
>index 0000000..23c3bf4
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmBase.h
>@@ -0,0 +1,87 @@
>+/** @file
>+  EFI MM Base Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol is utilized by all MM drivers to locate the MM infrastructure
>services and determine
>+  whether the driver is being invoked inside MMRAM or outside of MMRAM.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_BASE_H_
>+#define _MM_BASE_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_BASE_PROTOCOL_GUID \
>+  { \
>+    0xf4ccbfb7, 0xf6e0, 0x47fd, {0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }
>\
>+  }
>+
>+typedef struct _EFI_MM_BASE_PROTOCOL  EFI_MM_BASE_PROTOCOL;
>+
>+/**
>+  Service to indicate whether the driver is currently executing in the MM
>Initialization phase.
>+
>+  This service is used to indicate whether the driver is currently executing in
>the MM Initialization
>+  phase. For MM drivers, this will return TRUE in InMmram while inside the
>driver's entry point and
>+  otherwise FALSE. For combination MM/DXE drivers, this will return FALSE in
>the DXE launch. For the
>+  MM launch, it behaves as an MM driver.
>+
>+  @param[in]  This               The EFI_MM_BASE_PROTOCOL instance.
>+  @param[out] InMmram            Pointer to a Boolean which, on return,
>indicates that the driver is
>+                                 currently executing inside of MMRAM (TRUE) or outside of
>MMRAM (FALSE).
>+
>+  @retval EFI_SUCCESS            The call returned successfully.
>+  @retval EFI_INVALID_PARAMETER  InMmram was NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_INSIDE_OUT)(
>+  IN CONST EFI_MM_BASE_PROTOCOL    *This,
>+  OUT BOOLEAN                      *InMmram
>+  )
>+;
>+
>+/**
>+  Returns the location of the Management Mode Service Table (MMST).
>+
>+  This function returns the location of the Management Mode Service Table
>(MMST).  The use of the
>+  API is such that a driver can discover the location of the MMST in its entry
>point and then cache it in
>+  some driver global variable so that the MMST can be invoked in subsequent
>handlers.
>+
>+  @param[in]     This            The EFI_MM_BASE_PROTOCOL instance.
>+  @param[in,out] Mmst            On return, points to a pointer to the
>Management Mode Service Table (MMST).
>+
>+  @retval EFI_SUCCESS            The operation was successful.
>+  @retval EFI_INVALID_PARAMETER  Mmst was invalid.
>+  @retval EFI_UNSUPPORTED        Not in MM.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_GET_MMST_LOCATION)(
>+  IN CONST EFI_MM_BASE_PROTOCOL  *This,
>+  IN OUT EFI_MM_SYSTEM_TABLE     **Mmst
>+  )
>+;
>+
>+///
>+/// EFI MM Base Protocol is utilized by all MM drivers to locate the MM
>infrastructure
>+/// services and determine whether the driver is being invoked inside
>MMRAM or outside of MMRAM.
>+///
>+struct _EFI_MM_BASE_PROTOCOL {
>+  EFI_MM_INSIDE_OUT         InMm;
>+  EFI_MM_GET_MMST_LOCATION  GetMmstLocation;
>+};
>+
>+extern EFI_GUID gEfiMmBaseProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmCommunication.h
>b/MdePkg/Include/Protocol/MmCommunication.h
>new file mode 100644
>index 0000000..5dbb38e
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmCommunication.h
>@@ -0,0 +1,83 @@
>+/** @file
>+  EFI MM Communication Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol provides a means of communicating between drivers outside
>of MM and MMI
>+  handlers inside of MM.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_COMMUNICATION_H_
>+#define _MM_COMMUNICATION_H_
>+
>+#pragma pack(1)
>+
>+///
>+/// To avoid confusion in interpreting frames, the communication buffer
>should always
>+/// begin with EFI_MM_COMMUNICATE_HEADER
>+///
>+typedef struct {
>+  ///
>+  /// Allows for disambiguation of the message format.
>+  ///
>+  EFI_GUID  HeaderGuid;
>+  ///
>+  /// Describes the size of Data (in bytes) and does not include the size of the
>header.
>+  ///
>+  UINTN     MessageLength;
>+  ///
>+  /// Designates an array of bytes that is MessageLength in size.
>+  ///
>+  UINT8     Data[1];
>+} EFI_MM_COMMUNICATE_HEADER;
>+
>+#pragma pack()
>+
>+#define EFI_MM_COMMUNICATION_PROTOCOL_GUID \
>+  { \
>+    0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3,
>0x32 } \
>+  }
>+
>+typedef struct _EFI_MM_COMMUNICATION_PROTOCOL
>EFI_MM_COMMUNICATION_PROTOCOL;
>+
>+/**
>+  Communicates with a registered handler.
>+
>+  This function provides a service to send and receive messages from a
>registered UEFI service.
>+
>+  @param[in] This                The EFI_MM_COMMUNICATION_PROTOCOL
>instance.
>+  @param[in] CommBuffer          A pointer to the buffer to convey into
>MMRAM.
>+  @param[in] CommSize            The size of the data buffer being passed in.On
>exit, the size of data
>+                                 being returned. Zero if the handler does not wish to reply
>with any data.
>+
>+  @retval EFI_SUCCESS            The message was successfully posted.
>+  @retval EFI_INVALID_PARAMETER  The CommBuffer was NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_COMMUNICATE)(
>+  IN CONST EFI_MM_COMMUNICATION_PROTOCOL   *This,
>+  IN OUT VOID                              *CommBuffer,
>+  IN OUT UINTN                             *CommSize
>+  );
>+
>+///
>+/// EFI MM Communication Protocol provides runtime services for
>communicating
>+/// between DXE drivers and a registered MMI handler.
>+///
>+struct _EFI_MM_COMMUNICATION_PROTOCOL {
>+  EFI_MM_COMMUNICATE  Communicate;
>+};
>+
>+extern EFI_GUID gEfiMmCommunicationProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmConfiguration.h
>b/MdePkg/Include/Protocol/MmConfiguration.h
>new file mode 100644
>index 0000000..aacd96c
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmConfiguration.h
>@@ -0,0 +1,86 @@
>+/** @file
>+  EFI MM Configuration Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol is used to:
>+  1) report the portions of MMRAM regions which cannot be used for the
>MMRAM heap.
>+  2) register the MM Foundation entry point with the processor code. The
>entry
>+     point will be invoked by the MM processor entry code.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_CONFIGURATION_H_
>+#define _MM_CONFIGURATION_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_CONFIGURATION_PROTOCOL_GUID \
>+  { \
>+    0x26eeb3de, 0xb689, 0x492e, {0x80, 0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b,
>0xa7 }  \
>+  }
>+
>+///
>+/// Structure describing a MMRAM region which cannot be used for the
>MMRAM heap.
>+///
>+typedef struct _EFI_MM_RESERVED_MMRAM_REGION {
>+  ///
>+  /// Starting address of the reserved MMRAM area, as it appears while
>MMRAM is open.
>+  /// Ignored if MmramReservedSize is 0.
>+  ///
>+  EFI_PHYSICAL_ADDRESS    MmramReservedStart;
>+  ///
>+  /// Number of bytes occupied by the reserved MMRAM area. A size of zero
>indicates the
>+  /// last MMRAM area.
>+  ///
>+  UINT64                  MmramReservedSize;
>+} EFI_MM_RESERVED_MMRAM_REGION;
>+
>+typedef struct _EFI_MM_CONFIGURATION_PROTOCOL
>EFI_MM_CONFIGURATION_PROTOCOL;
>+
>+/**
>+  Register the MM Foundation entry point.
>+
>+  This function registers the MM Foundation entry point with the processor
>code. This entry point
>+  will be invoked by the MM Processor entry code.
>+
>+  @param[in] This                The EFI_MM_CONFIGURATION_PROTOCOL
>instance.
>+  @param[in] MmEntryPoint        MM Foundation entry point.
>+
>+  @retval EFI_SUCCESS            Success to register MM Entry Point.
>+  @retval EFI_INVALID_PARAMETER  MmEntryPoint is NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_REGISTER_MM_ENTRY)(
>+  IN CONST EFI_MM_CONFIGURATION_PROTOCOL  *This,
>+  IN EFI_MM_ENTRY_POINT                   MmEntryPoint
>+  );
>+
>+///
>+/// The EFI MM Configuration Protocol is a mandatory protocol published by
>a DXE CPU driver to
>+/// indicate which areas within MMRAM are reserved for use by the CPU for
>any purpose,
>+/// such as stack, save state or MM entry point.
>+///
>+/// The RegistermmEntry() function allows the MM IPL DXE driver to register
>the MM
>+/// Foundation entry point with the MM entry vector code.
>+///
>+struct _EFI_MM_CONFIGURATION_PROTOCOL {
>+  ///
>+  /// A pointer to an array MMRAM ranges used by the initial MM entry code.
>+  ///
>+  EFI_MM_RESERVED_MMRAM_REGION  *MmramReservedRegions;
>+  EFI_MM_REGISTER_MM_ENTRY      RegisterMmEntry;
>+};
>+
>+extern EFI_GUID gEfiMmConfigurationProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmControl.h
>b/MdePkg/Include/Protocol/MmControl.h
>new file mode 100644
>index 0000000..c8672c5
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmControl.h
>@@ -0,0 +1,106 @@
>+/** @file
>+  EFI MM Control Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol is used initiate synchronous MMI activations. This protocol
>could be published by a
>+  processor driver to abstract the MMI IPI or a driver which abstracts the ASIC
>that is supporting the
>+  APM port. Because of the possibility of performing MMI IPI transactions,
>the ability to generate this
>+  event from a platform chipset agent is an optional capability for both IA-32
>and x64-based systems.
>+
>+  The EFI_MM_CONTROL_PROTOCOL is produced by a runtime driver. It
>provides  an
>+  abstraction of the platform hardware that generates an MMI.  There are
>often I/O ports that, when
>+  accessed, will generate the MMI.  Also, the hardware optionally supports
>the periodic generation of
>+  these signals.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_CONTROL_H_
>+#define _MM_CONTROL_H_
>+
>+#include <PiDxe.h>
>+
>+#define EFI_MM_CONTROL_PROTOCOL_GUID \
>+  { \
>+    0x843dc720, 0xab1e, 0x42cb, {0x93, 0x57, 0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}
>\
>+  }
>+
>+typedef struct _EFI_MM_CONTROL_PROTOCOL
>EFI_MM_CONTROL_PROTOCOL;
>+typedef UINTN  EFI_MM_PERIOD;
>+
>+/**
>+  Invokes MMI activation from either the preboot or runtime environment.
>+
>+  This function generates an MMI.
>+
>+  @param[in]     This                The EFI_MM_CONTROL_PROTOCOL instance.
>+  @param[in,out] CommandPort         The value written to the command port.
>+  @param[in,out] DataPort            The value written to the data port.
>+  @param[in]     Periodic            Optional mechanism to engender a periodic
>stream.
>+  @param[in]     ActivationInterval  Optional parameter to repeat at this
>period one
>+                                     time or, if the Periodic Boolean is set, periodically.
>+
>+  @retval EFI_SUCCESS            The MMI/PMI has been engendered.
>+  @retval EFI_DEVICE_ERROR       The timing is unsupported.
>+  @retval EFI_INVALID_PARAMETER  The activation period is unsupported.
>+  @retval EFI_INVALID_PARAMETER  The last periodic activation has not been
>cleared.
>+  @retval EFI_NOT_STARTED        The MM base service has not been
>initialized.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_ACTIVATE)(
>+  IN CONST EFI_MM_CONTROL_PROTOCOL    *This,
>+  IN OUT UINT8                        *CommandPort       OPTIONAL,
>+  IN OUT UINT8                        *DataPort          OPTIONAL,
>+  IN BOOLEAN                          Periodic           OPTIONAL,
>+  IN UINTN                            ActivationInterval OPTIONAL
>+  );
>+
>+/**
>+  Clears any system state that was created in response to the Trigger() call.
>+
>+  This function acknowledges and causes the deassertion of the MMI
>activation source.
>+
>+  @param[in] This                The EFI_MM_CONTROL_PROTOCOL instance.
>+  @param[in] Periodic            Optional parameter to repeat at this period one
>time
>+
>+  @retval EFI_SUCCESS            The MMI/PMI has been engendered.
>+  @retval EFI_DEVICE_ERROR       The source could not be cleared.
>+  @retval EFI_INVALID_PARAMETER  The service did not support the Periodic
>input argument.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_DEACTIVATE)(
>+  IN CONST EFI_MM_CONTROL_PROTOCOL    *This,
>+  IN BOOLEAN                          Periodic OPTIONAL
>+  );
>+
>+///
>+/// The EFI_MM_CONTROL_PROTOCOL is produced by a runtime driver. It
>provides  an
>+/// abstraction of the platform hardware that generates an MMI.  There are
>often I/O ports that, when
>+/// accessed, will generate the MMI.  Also, the hardware optionally supports
>the periodic generation of
>+/// these signals.
>+///
>+struct _EFI_MM_CONTROL_PROTOCOL {
>+  EFI_MM_ACTIVATE    Trigger;
>+  EFI_MM_DEACTIVATE  Clear;
>+  ///
>+  /// Minimum interval at which the platform can set the period.  A maximum
>is not
>+  /// specified in that the MM infrastructure code can emulate a maximum
>interval that is
>+  /// greater than the hardware capabilities by using software emulation in
>the MM
>+  /// infrastructure code.
>+  ///
>+  EFI_MM_PERIOD      MinimumTriggerPeriod;
>+};
>+
>+extern EFI_GUID gEfiMmControlProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmCpu.h
>b/MdePkg/Include/Protocol/MmCpu.h
>new file mode 100644
>index 0000000..d6ddbcd
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmCpu.h
>@@ -0,0 +1,247 @@
>+/** @file
>+  EFI MM CPU Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol allows MM drivers to access architecture-standard registers
>from any of the CPU
>+  save state areas. In some cases, difference processors provide the same
>information in the save state,
>+  but not in the same format. These so-called pseudo-registers provide this
>information in a standard
>+  format.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_CPU_H_
>+#define _MM_CPU_H_
>+
>+#define EFI_MM_CPU_PROTOCOL_GUID \
>+  { \
>+    0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22, 0xf8, 0xe9, 0x2b, 0xb3, 0xd5,
>0x69 } \
>+  }
>+
>+///
>+/// Save State register index
>+///
>+typedef enum {
>+  ///
>+  /// x86/X64 standard registers
>+  ///
>+  EFI_MM_SAVE_STATE_REGISTER_GDTBASE       = 4,
>+  EFI_MM_SAVE_STATE_REGISTER_IDTBASE       = 5,
>+  EFI_MM_SAVE_STATE_REGISTER_LDTBASE       = 6,
>+  EFI_MM_SAVE_STATE_REGISTER_GDTLIMIT      = 7,
>+  EFI_MM_SAVE_STATE_REGISTER_IDTLIMIT      = 8,
>+  EFI_MM_SAVE_STATE_REGISTER_LDTLIMIT      = 9,
>+  EFI_MM_SAVE_STATE_REGISTER_LDTINFO       = 10,
>+  EFI_MM_SAVE_STATE_REGISTER_ES            = 20,
>+  EFI_MM_SAVE_STATE_REGISTER_CS            = 21,
>+  EFI_MM_SAVE_STATE_REGISTER_SS            = 22,
>+  EFI_MM_SAVE_STATE_REGISTER_DS            = 23,
>+  EFI_MM_SAVE_STATE_REGISTER_FS            = 24,
>+  EFI_MM_SAVE_STATE_REGISTER_GS            = 25,
>+  EFI_MM_SAVE_STATE_REGISTER_LDTR_SEL      = 26,
>+  EFI_MM_SAVE_STATE_REGISTER_TR_SEL        = 27,
>+  EFI_MM_SAVE_STATE_REGISTER_DR7           = 28,
>+  EFI_MM_SAVE_STATE_REGISTER_DR6           = 29,
>+  EFI_MM_SAVE_STATE_REGISTER_R8            = 30,
>+  EFI_MM_SAVE_STATE_REGISTER_R9            = 31,
>+  EFI_MM_SAVE_STATE_REGISTER_R10           = 32,
>+  EFI_MM_SAVE_STATE_REGISTER_R11           = 33,
>+  EFI_MM_SAVE_STATE_REGISTER_R12           = 34,
>+  EFI_MM_SAVE_STATE_REGISTER_R13           = 35,
>+  EFI_MM_SAVE_STATE_REGISTER_R14           = 36,
>+  EFI_MM_SAVE_STATE_REGISTER_R15           = 37,
>+  EFI_MM_SAVE_STATE_REGISTER_RAX           = 38,
>+  EFI_MM_SAVE_STATE_REGISTER_RBX           = 39,
>+  EFI_MM_SAVE_STATE_REGISTER_RCX           = 40,
>+  EFI_MM_SAVE_STATE_REGISTER_RDX           = 41,
>+  EFI_MM_SAVE_STATE_REGISTER_RSP           = 42,
>+  EFI_MM_SAVE_STATE_REGISTER_RBP           = 43,
>+  EFI_MM_SAVE_STATE_REGISTER_RSI           = 44,
>+  EFI_MM_SAVE_STATE_REGISTER_RDI           = 45,
>+  EFI_MM_SAVE_STATE_REGISTER_RIP           = 46,
>+  EFI_MM_SAVE_STATE_REGISTER_RFLAGS        = 51,
>+  EFI_MM_SAVE_STATE_REGISTER_CR0           = 52,
>+  EFI_MM_SAVE_STATE_REGISTER_CR3           = 53,
>+  EFI_MM_SAVE_STATE_REGISTER_CR4           = 54,
>+  EFI_MM_SAVE_STATE_REGISTER_FCW           = 256,
>+  EFI_MM_SAVE_STATE_REGISTER_FSW           = 257,
>+  EFI_MM_SAVE_STATE_REGISTER_FTW           = 258,
>+  EFI_MM_SAVE_STATE_REGISTER_OPCODE        = 259,
>+  EFI_MM_SAVE_STATE_REGISTER_FP_EIP        = 260,
>+  EFI_MM_SAVE_STATE_REGISTER_FP_CS         = 261,
>+  EFI_MM_SAVE_STATE_REGISTER_DATAOFFSET    = 262,
>+  EFI_MM_SAVE_STATE_REGISTER_FP_DS         = 263,
>+  EFI_MM_SAVE_STATE_REGISTER_MM0           = 264,
>+  EFI_MM_SAVE_STATE_REGISTER_MM1           = 265,
>+  EFI_MM_SAVE_STATE_REGISTER_MM2           = 266,
>+  EFI_MM_SAVE_STATE_REGISTER_MM3           = 267,
>+  EFI_MM_SAVE_STATE_REGISTER_MM4           = 268,
>+  EFI_MM_SAVE_STATE_REGISTER_MM5           = 269,
>+  EFI_MM_SAVE_STATE_REGISTER_MM6           = 270,
>+  EFI_MM_SAVE_STATE_REGISTER_MM7           = 271,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM0          = 272,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM1          = 273,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM2          = 274,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM3          = 275,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM4          = 276,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM5          = 277,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM6          = 278,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM7          = 279,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM8          = 280,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM9          = 281,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM10         = 282,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM11         = 283,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM12         = 284,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM13         = 285,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM14         = 286,
>+  EFI_MM_SAVE_STATE_REGISTER_XMM15         = 287,
>+  ///
>+  /// Pseudo-Registers
>+  ///
>+  EFI_MM_SAVE_STATE_REGISTER_IO            = 512,
>+  EFI_MM_SAVE_STATE_REGISTER_LMA           = 513,
>+  EFI_MM_SAVE_STATE_REGISTER_PROCESSOR_ID  = 514
>+} EFI_MM_SAVE_STATE_REGISTER;
>+
>+///
>+/// The EFI_MM_SAVE_STATE_REGISTER_LMA pseudo-register values
>+/// If the processor acts in 32-bit mode at the time the MMI occurred, the
>pseudo register value
>+/// EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT is returned in Buffer.
>Otherwise,
>+/// EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT is returned in Buffer.
>+///
>+#define EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT  32
>+#define EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT  64
>+
>+///
>+/// Size width of I/O instruction
>+///
>+typedef enum {
>+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT8      = 0,
>+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT16     = 1,
>+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT32     = 2,
>+  EFI_MM_SAVE_STATE_IO_WIDTH_UINT64     = 3
>+} EFI_MM_SAVE_STATE_IO_WIDTH;
>+
>+///
>+/// Types of I/O instruction
>+///
>+typedef enum {
>+  EFI_MM_SAVE_STATE_IO_TYPE_INPUT       = 1,
>+  EFI_MM_SAVE_STATE_IO_TYPE_OUTPUT      = 2,
>+  EFI_MM_SAVE_STATE_IO_TYPE_STRING      = 4,
>+  EFI_MM_SAVE_STATE_IO_TYPE_REP_PREFIX  = 8
>+} EFI_MM_SAVE_STATE_IO_TYPE;
>+
>+///
>+/// Structure of the data which is returned when ReadSaveState() is called
>with
>+/// EFI_MM_SAVE_STATE_REGISTER_IO. If there was no I/O then
>ReadSaveState() will
>+/// return EFI_NOT_FOUND.
>+///
>+/// This structure describes the I/O operation which was in process when the
>MMI was generated.
>+///
>+typedef struct _EFI_MM_SAVE_STATE_IO_INFO {
>+  ///
>+  /// For input instruction (IN, INS), this is data read before the MMI occurred.
>For output
>+  /// instructions (OUT, OUTS) this is data that was written before the MMI
>occurred. The
>+  /// width of the data is specified by IoWidth.
>+  ///
>+  UINT64                        IoData;
>+  ///
>+  /// The I/O port that was being accessed when the MMI was triggered.
>+  ///
>+  UINT16                        IoPort;
>+  ///
>+  /// Defines the size width (UINT8, UINT16, UINT32, UINT64) for IoData.
>+  ///
>+  EFI_MM_SAVE_STATE_IO_WIDTH    IoWidth;
>+  ///
>+  /// Defines type of I/O instruction.
>+  ///
>+  EFI_MM_SAVE_STATE_IO_TYPE     IoType;
>+} EFI_MM_SAVE_STATE_IO_INFO;
>+
>+typedef struct _EFI_MM_CPU_PROTOCOL  EFI_MM_CPU_PROTOCOL;
>+
>+/**
>+  Read data from the CPU save state.
>+
>+  This function is used to read the specified number of bytes of the specified
>register from the CPU
>+  save state of the specified CPU and place the value into the buffer. If the
>CPU does not support the
>+  specified register Register, then EFI_NOT_FOUND  should be returned. If
>the CPU does not
>+  support the specified register width Width, then EFI_INVALID_PARAMETER
>is returned.
>+
>+  @param[in]  This               The EFI_MM_CPU_PROTOCOL instance.
>+  @param[in]  Width              The number of bytes to read from the CPU save
>state.
>+  @param[in]  Register           Specifies the CPU register to read form the save
>state.
>+  @param[in]  CpuIndex           Specifies the zero-based index of the CPU save
>state.
>+  @param[out] Buffer             Upon return, this holds the CPU register value
>read from the save state.
>+
>+  @retval EFI_SUCCESS            The register was read from Save State.
>+  @retval EFI_NOT_FOUND          The register is not defined for the Save State
>of Processor.
>+  @retval EFI_INVALID_PARAMETER  Input parameters are not valid, for
>example, Processor No or register width
>+                                 is not correct.This or Buffer is NULL.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_READ_SAVE_STATE)(
>+  IN CONST EFI_MM_CPU_PROTOCOL    *This,
>+  IN UINTN                        Width,
>+  IN EFI_MM_SAVE_STATE_REGISTER   Register,
>+  IN UINTN                        CpuIndex,
>+  OUT VOID                        *Buffer
>+  );
>+
>+
>+/**
>+  Write data to the CPU save state.
>+
>+  This function is used to write the specified number of bytes of the specified
>register to the CPU save
>+  state of the specified CPU and place the value into the buffer. If the CPU
>does not support the
>+  specified register Register, then EFI_UNSUPPORTED should be returned. If
>the CPU does not
>+  support the specified register width Width, then EFI_INVALID_PARAMETER
>is returned.
>+
>+  @param[in]  This               The EFI_MM_CPU_PROTOCOL instance.
>+  @param[in]  Width              The number of bytes to write to the CPU save
>state.
>+  @param[in]  Register           Specifies the CPU register to write to the save
>state.
>+  @param[in]  CpuIndex           Specifies the zero-based index of the CPU save
>state.
>+  @param[in]  Buffer             Upon entry, this holds the new CPU register value.
>+
>+  @retval EFI_SUCCESS            The register was written to Save State.
>+  @retval EFI_NOT_FOUND          The register is not defined for the Save State
>of Processor.
>+  @retval EFI_INVALID_PARAMETER  Input parameters are not valid. For
>example:
>+                                 ProcessorIndex or Width is not correct.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_WRITE_SAVE_STATE)(
>+  IN CONST EFI_MM_CPU_PROTOCOL    *This,
>+  IN UINTN                        Width,
>+  IN EFI_MM_SAVE_STATE_REGISTER   Register,
>+  IN UINTN                        CpuIndex,
>+  IN CONST VOID                   *Buffer
>+  );
>+
>+///
>+/// EFI MM CPU Protocol provides access to CPU-related information while in
>MM.
>+///
>+/// This protocol allows MM drivers to access architecture-standard registers
>from any of the CPU
>+/// save state areas. In some cases, difference processors provide the same
>information in the save state,
>+/// but not in the same format. These so-called pseudo-registers provide this
>information in a standard
>+/// format.
>+///
>+struct _EFI_MM_CPU_PROTOCOL {
>+  EFI_MM_READ_SAVE_STATE   ReadSaveState;
>+  EFI_MM_WRITE_SAVE_STATE  WriteSaveState;
>+};
>+
>+extern EFI_GUID gEfiMmCpuProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmCpuIo.h
>b/MdePkg/Include/Protocol/MmCpuIo.h
>new file mode 100644
>index 0000000..9fda26c
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmCpuIo.h
>@@ -0,0 +1,96 @@
>+/** @file
>+  MM CPU I/O 2 protocol as defined in the PI 1.2 specification.
>+
>+  This protocol provides CPU I/O and memory access within MM.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_CPU_IO_H_
>+#define _MM_CPU_IO_H_
>+
>+#define EFI_MM_CPU_IO_PROTOCOL_GUID \
>+  { \
>+    0x3242A9D8, 0xCE70, 0x4AA0, { 0x95, 0x5D, 0x5E, 0x7B, 0x14, 0x0D, 0xE4,
>0xD2 } \
>+  }
>+
>+typedef struct _EFI_MM_CPU_IO_PROTOCOL
>EFI_MM_CPU_IO_PROTOCOL;
>+
>+///
>+/// Width of the MM CPU I/O operations
>+///
>+typedef enum {
>+  MM_IO_UINT8  = 0,
>+  MM_IO_UINT16 = 1,
>+  MM_IO_UINT32 = 2,
>+  MM_IO_UINT64 = 3
>+} EFI_MM_IO_WIDTH;
>+
>+/**
>+  Provides the basic memory and I/O interfaces used toabstract accesses to
>devices.
>+
>+  The I/O operations are carried out exactly as requested.  The caller is
>+  responsible for any alignment and I/O width issues that the bus, device,
>+  platform, or type of I/O might require.
>+
>+  @param[in]      This     The EFI_MM_CPU_IO_PROTOCOL instance.
>+  @param[in]      Width    Signifies the width of the I/O operations.
>+  @param[in]      Address  The base address of the I/O operations.  The caller
>is
>+                           responsible for aligning the Address if required.
>+  @param[in]      Count    The number of I/O operations to perform.
>+  @param[in,out]  Buffer   For read operations, the destination buffer to
>store
>+                           the results.  For write operations, the source buffer
>+                           from which to write data.
>+
>+  @retval EFI_SUCCESS            The data was read from or written to the device.
>+  @retval EFI_UNSUPPORTED        The Address is not valid for this system.
>+  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
>+  @retval EFI_OUT_OF_RESOURCES   The request could not be completed
>due to a lack
>+                                 of resources.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_CPU_IO)(
>+  IN     CONST EFI_MM_CPU_IO_PROTOCOL    *This,
>+  IN     EFI_MM_IO_WIDTH                 Width,
>+  IN     UINT64                          Address,
>+  IN     UINTN                           Count,
>+  IN OUT VOID                            *Buffer
>+  );
>+
>+typedef struct {
>+  ///
>+  /// This service provides the various modalities of memory and I/O read.
>+  ///
>+  EFI_MM_CPU_IO  Read;
>+  ///
>+  /// This service provides the various modalities of memory and I/O write.
>+  ///
>+  EFI_MM_CPU_IO  Write;
>+} EFI_MM_IO_ACCESS;
>+
>+///
>+/// MM CPU I/O Protocol provides CPU I/O and memory access within MM.
>+///
>+struct _EFI_MM_CPU_IO_PROTOCOL {
>+  ///
>+  /// Allows reads and writes to memory-mapped I/O space.
>+  ///
>+  EFI_MM_IO_ACCESS Mem;
>+  ///
>+  /// Allows reads and writes to I/O space.
>+  ///
>+  EFI_MM_IO_ACCESS Io;
>+};
>+
>+extern EFI_GUID gEfiMmCpuIoProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmEndOfDxe.h
>b/MdePkg/Include/Protocol/MmEndOfDxe.h
>new file mode 100644
>index 0000000..6c3f17a
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmEndOfDxe.h
>@@ -0,0 +1,33 @@
>+/** @file
>+  MM End Of Dxe protocol introduced in the PI 1.2.1 specification.
>+
>+  According to PI 1.4a specification, this protocol indicates end of the
>+  execution phase when all of the components are under the authority of
>+  the platform manufacturer.
>+  This protocol is a mandatory protocol published by MM Foundation code.
>+  This protocol is an MM counterpart of the End of DXE Event.
>+  This protocol prorogates End of DXE notification into MM environment.
>+  This protocol is installed prior to installation of the MM Ready to Lock
>Protocol.
>+
>+  Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_END_OF_DXE_H_
>+#define _MM_END_OF_DXE_H_
>+
>+#define EFI_MM_END_OF_DXE_PROTOCOL_GUID \
>+  { \
>+    0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }
>\
>+  }
>+
>+extern EFI_GUID gEfiMmEndOfDxeProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmGpiDispatch.h
>b/MdePkg/Include/Protocol/MmGpiDispatch.h
>new file mode 100644
>index 0000000..5682e75
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmGpiDispatch.h
>@@ -0,0 +1,125 @@
>+/** @file
>+  MM General Purpose Input (GPI) Dispatch Protocol as defined in PI 1.1
>Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides the parent dispatch service for the General Purpose
>Input
>+  (GPI) MMI source generator.
>+
>+  The EFI_MM_GPI_DISPATCH_PROTOCOL provides the ability to install child
>handlers for the
>+  given event types.  Several inputs can be enabled.  This purpose of this
>interface is to generate an
>+  MMI in response to any of these inputs having a true value provided.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_GPI_DISPATCH_H_
>+#define _MM_GPI_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_GPI_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x25566b03, 0xb577, 0x4cbf, {0x95, 0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43,
>0x80 } \
>+  }
>+
>+///
>+/// The dispatch function's context.
>+///
>+typedef struct {
>+  ///
>+  /// A number from one of 2^64 possible GPIs that can generate an MMI. A
>+  /// 0 corresponds to logical GPI[0]; 1 corresponds to logical GPI[1]; and
>+  /// GpiNum of N corresponds to GPI[N], where N can span from 0 to 2^64-1.
>+  ///
>+  UINT64 GpiNum;
>+} EFI_MM_GPI_REGISTER_CONTEXT;
>+
>+typedef struct _EFI_MM_GPI_DISPATCH_PROTOCOL
>EFI_MM_GPI_DISPATCH_PROTOCOL;
>+
>+/**
>+  Registers a child MMI source dispatch function with a parent MM driver.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when an MMI is
>+  generated because of one or more of the GPIs specified by RegisterContext.
>On return,
>+  DispatchHandle contains a unique handle which may be used later to
>unregister the function
>+  using UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer pointing to another
>instance of
>+  EFI_MM_GPI_REGISTER_CONTEXT describing the GPIs which actually
>caused the MMI and
>+  CommBufferSize pointing to the size of the structure.
>+
>+  @param[in]  This               Pointer to the EFI_MM_GPI_DISPATCH_PROTOCOL
>instance.
>+  @param[in]  DispatchFunction   Function to register for handler when the
>specified GPI causes an MMI.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>+                                 The caller fills this context in before calling
>+                                 the register function to indicate to the register
>+                                 function the GPI(s) for which the dispatch function
>+                                 should be invoked.
>+  @param[out] DispatchHandle     Handle generated by the dispatcher to
>track the
>+                                 function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The GPI input
>value
>+                                 is not within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_GPI_REGISTER)(
>+  IN CONST EFI_MM_GPI_DISPATCH_PROTOCOL    *This,
>+  IN       EFI_MM_HANDLER_ENTRY_POINT      DispatchFunction,
>+  IN CONST EFI_MM_GPI_REGISTER_CONTEXT     *RegisterContext,
>+  OUT      EFI_HANDLE                      *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters a General Purpose Input (GPI) service.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called when the GPI triggers an MMI.
>+
>+  @param[in]  This               Pointer to the EFI_MM_GPI_DISPATCH_PROTOCOL
>instance.
>+  @param[in]  DispatchHandle     Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            Handle of the service to remove.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_GPI_UNREGISTER)(
>+  IN CONST EFI_MM_GPI_DISPATCH_PROTOCOL    *This,
>+  IN       EFI_HANDLE                      DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM GPI MMI Dispatch Protocol
>+///
>+/// The MM GPI MMI Dispatch Protocol provides the parent dispatch service
>+/// for the General Purpose Input (GPI) MMI source generator.
>+///
>+struct _EFI_MM_GPI_DISPATCH_PROTOCOL {
>+  EFI_MM_GPI_REGISTER    Register;
>+  EFI_MM_GPI_UNREGISTER  UnRegister;
>+  ///
>+  /// Denotes the maximum value of inputs that can have handlers attached.
>+  ///
>+  UINTN                   NumSupportedGpis;
>+};
>+
>+extern EFI_GUID gEfiMmGpiDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmIoTrapDispatch.h
>b/MdePkg/Include/Protocol/MmIoTrapDispatch.h
>new file mode 100644
>index 0000000..ae116a0
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmIoTrapDispatch.h
>@@ -0,0 +1,136 @@
>+/** @file
>+  MM IO Trap Dispatch Protocol as defined in PI 1.1 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides a parent dispatch service for IO trap MMI sources.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_IO_TRAP_DISPATCH_H_
>+#define _MM_IO_TRAP_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_IO_TRAP_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x58dc368d, 0x7bfa, 0x4e77, {0xab, 0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 }
>\
>+  }
>+
>+///
>+/// IO Trap valid types
>+///
>+typedef enum {
>+  WriteTrap,
>+  ReadTrap,
>+  ReadWriteTrap,
>+  IoTrapTypeMaximum
>+} EFI_MM_IO_TRAP_DISPATCH_TYPE;
>+
>+///
>+/// IO Trap context structure containing information about the
>+/// IO trap event that should invoke the handler
>+///
>+typedef struct {
>+  UINT16                         Address;
>+  UINT16                         Length;
>+  EFI_MM_IO_TRAP_DISPATCH_TYPE   Type;
>+} EFI_MM_IO_TRAP_REGISTER_CONTEXT;
>+
>+///
>+/// IO Trap context structure containing information about the IO trap that
>occurred
>+///
>+typedef struct {
>+  UINT32  WriteData;
>+} EFI_MM_IO_TRAP_CONTEXT;
>+
>+typedef struct _EFI_MM_IO_TRAP_DISPATCH_PROTOCOL
>EFI_MM_IO_TRAP_DISPATCH_PROTOCOL;
>+
>+/**
>+  Register an IO trap MMI child handler for a specified MMI.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when an MMI is
>+  generated because of an access to an I/O port specified by RegisterContext.
>On return,
>+  DispatchHandle contains a unique handle which may be used later to
>unregister the function
>+  using UnRegister(). If the base of the I/O range specified is zero, then an
>I/O range with the
>+  specified length and characteristics will be allocated and the Address field in
>RegisterContext
>+  updated. If no range could be allocated, then EFI_OUT_OF_RESOURCES will
>be returned.
>+
>+  The service will not perform GCD allocation if the base address is non-zero
>or
>+  EFI_MM_READY_TO_LOCK has been installed.  In this case, the caller is
>responsible for the
>+  existence and allocation of the specific IO range.
>+  An error may be returned if some or all of the requested resources conflict
>with an existing IO trap
>+  child handler.
>+
>+  It is not required that implementations will allow multiple children for a
>single IO trap MMI source.
>+  Some implementations may support multiple children.
>+  The DispatchFunction will be called with Context updated to contain
>information
>+  concerning the I/O action that actually happened and is passed in
>RegisterContext, with
>+  CommBuffer pointing to the data actually written and CommBufferSize
>pointing to the size of
>+  the data in CommBuffer.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_IO_TRAP_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction   Function to register for handler when I/O
>trap location is accessed.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>The caller fills this
>+                                 context in before calling the register function to indicate to
>the register
>+                                 function the IO trap MMI source for which the dispatch
>function should be invoked.
>+  @param[out] DispatchHandle     Handle of the dispatch function, for when
>interfacing with the parent MM driver.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>registered.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to complete due to
>hardware error.
>+  @retval EFI_OUT_OF_RESOURCES   Insufficient resources are available to
>fulfill the IO trap range request.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid.  The input
>value is not within a valid range.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_IO_TRAP_DISPATCH_REGISTER)(
>+  IN CONST EFI_MM_IO_TRAP_DISPATCH_PROTOCOL    *This,
>+  IN       EFI_MM_HANDLER_ENTRY_POINT          DispatchFunction,
>+  IN OUT   EFI_MM_IO_TRAP_REGISTER_CONTEXT     *RegisterContext,
>+     OUT   EFI_HANDLE                          *DispatchHandle
>+  );
>+
>+/**
>+  Unregister a child MMI source dispatch function with a parent MM driver.
>+
>+  This service removes a previously installed child dispatch handler. This does
>not guarantee that the
>+  system resources will be freed from the GCD.
>+
>+  @param[in] This                Pointer to the
>EFI_MM_IO_TRAP_DISPATCH_PROTOCOL instance.
>+  @param[in] DispatchHandle      Handle of the child service to remove.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>unregistered.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_IO_TRAP_DISPATCH_UNREGISTER)(
>+  IN CONST EFI_MM_IO_TRAP_DISPATCH_PROTOCOL    *This,
>+  IN       EFI_HANDLE                          DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM IO Trap Dispatch Protocol.
>+///
>+/// This protocol provides a parent dispatch service for IO trap MMI sources.
>+///
>+struct _EFI_MM_IO_TRAP_DISPATCH_PROTOCOL {
>+  EFI_MM_IO_TRAP_DISPATCH_REGISTER    Register;
>+  EFI_MM_IO_TRAP_DISPATCH_UNREGISTER  UnRegister;
>+};
>+
>+extern EFI_GUID gEfiMmIoTrapDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmPciRootBridgeIo.h
>b/MdePkg/Include/Protocol/MmPciRootBridgeIo.h
>new file mode 100644
>index 0000000..a3f3946
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmPciRootBridgeIo.h
>@@ -0,0 +1,37 @@
>+/** @file
>+  MM PCI Root Bridge IO protocol as defined in the PI 1.2 specification.
>+
>+  This protocol provides PCI I/O and memory access within MM.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_PCI_ROOT_BRIDGE_IO_H_
>+#define _MM_PCI_ROOT_BRIDGE_IO_H_
>+
>+#include <Protocol/PciRootBridgeIo.h>
>+
>+#define EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \
>+  { \
>+    0x8bc1714d, 0xffcb, 0x41c3, { 0x89, 0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98,
>0xea } \
>+  }
>+
>+///
>+/// This protocol provides the same functionality as the PCI Root Bridge I/O
>Protocol defined in the
>+/// UEFI 2.1 Specifcation, section 13.2, except that the functions for Map()
>and Unmap() may return
>+/// EFI_UNSUPPORTED.
>+///
>+typedef EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
>EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL;
>+
>+extern EFI_GUID gEfiMmPciRootBridgeIoProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
>b/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
>new file mode 100644
>index 0000000..4f88dc8
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmPeriodicTimerDispatch.h
>@@ -0,0 +1,170 @@
>+/** @file
>+  MM Periodic Timer Dispatch Protocol as defined in PI 1.1 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides the parent dispatch service for the periodical timer
>MMI source generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_PERIODIC_TIMER_DISPATCH_H_
>+#define _MM_PERIODIC_TIMER_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x4cec368e, 0x8e8e, 0x4d71, {0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a,
>0x53 } \
>+  }
>+
>+///
>+/// Example: A chipset supports periodic MMIs on every 64ms or 2 seconds.
>+///   A child wishes schedule a period MMI to fire on a period of 3 seconds,
>there
>+///   are several ways to approach the problem:
>+///   1. The child may accept a 4 second periodic rate, in which case it registers
>with
>+///        Period = 40000
>+///        MmiTickInterval = 20000
>+///      The resulting MMI will occur every 2 seconds with the child called back
>on
>+///      every 2nd MMI.
>+///      NOTE: the same result would occur if the child set MmiTickInterval = 0.
>+///   2. The child may choose the finer granularity MMI (64ms):
>+///        Period = 30000
>+///        MmiTickInterval = 640
>+///      The resulting MMI will occur every 64ms with the child called back on
>+///      every 47th MMI.
>+///      NOTE: the child driver should be aware that this will result in more
>+///        MMIs occuring during system runtime which can negatively impact
>system
>+///        performance.
>+///
>+typedef struct {
>+  ///
>+  /// The minimum period of time in 100 nanosecond units that the child gets
>called. The
>+  /// child will be called back after a time greater than the time Period.
>+  ///
>+  UINT64  Period;
>+  ///
>+  /// The period of time interval between MMIs. Children of this interface
>should use this
>+  /// field when registering for periodic timer intervals when a finer
>granularity periodic
>+  /// MMI is desired.
>+  ///
>+  UINT64  MmiTickInterval;
>+} EFI_MM_PERIODIC_TIMER_REGISTER_CONTEXT;
>+
>+///
>+/// The DispatchFunction will be called with Context set to the same value as
>was passed into
>+/// Register() in RegisterContext and with CommBuffer pointing to an
>instance of
>+/// EFI_MM_PERIODIC_TIMER_CONTEXT and CommBufferSize pointing to
>its size.
>+///
>+typedef struct {
>+  ///
>+  /// ElapsedTime is the actual time in 100 nanosecond units elapsed since last
>called, a
>+  /// value of 0 indicates an unknown amount of time.
>+  ///
>+  UINT64  ElapsedTime;
>+} EFI_MM_PERIODIC_TIMER_CONTEXT;
>+
>+typedef struct _EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL
>EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL;
>+
>+/**
>+  Register a child MMI source dispatch function for MM periodic timer.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when at least the
>+  amount of time specified by RegisterContext has elapsed. On return,
>DispatchHandle
>+  contains a unique handle which may be used later to unregister the
>function using UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer pointing to an
>instance of
>+  EFI_MM_PERIODIC_TIMER_CONTEXT and CommBufferSize pointing to its
>size.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction   Function to register for handler when at
>least the specified amount
>+                                 of time has elapsed.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>+                                 The caller fills this context in before calling
>+                                 the register function to indicate to the register
>+                                 function the period at which the dispatch function
>+                                 should be invoked.
>+  @param[out] DispatchHandle     Handle generated by the dispatcher to
>track the function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The period
>input value
>+                                 is not within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_PERIODIC_TIMER_REGISTER)(
>+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL    *This,
>+  IN       EFI_MM_HANDLER_ENTRY_POINT                 DispatchFunction,
>+  IN CONST EFI_MM_PERIODIC_TIMER_REGISTER_CONTEXT
>*RegisterContext,
>+  OUT      EFI_HANDLE                                 *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters a periodic timer service.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called when the time has elapsed.
>+
>+  @param[in] This                Pointer to the
>EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
>+  @param[in] DispatchHandle      Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            The service has been successfully removed.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_PERIODIC_TIMER_UNREGISTER)(
>+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                               DispatchHandle
>+  );
>+
>+/**
>+  Returns the next MMI tick period supported by the chipset.
>+
>+  The order returned is from longest to shortest interval period.
>+
>+  @param[in]     This             Pointer to the
>EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance.
>+  @param[in,out] MmiTickInterval  Pointer to pointer of next shorter MMI
>interval
>+                                  period supported by the child. This parameter works as a
>get-first,
>+                                  get-next field.The first time this function is called,
>*MmiTickInterval
>+                                  should be set to NULL to get the longest MMI interval.The
>returned
>+                                  *MmiTickInterval should be passed in on subsequent calls
>to get the
>+                                  next shorter interval period until *MmiTickInterval = NULL.
>+
>+  @retval EFI_SUCCESS             The service returned successfully.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_PERIODIC_TIMER_INTERVAL)(
>+  IN CONST EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL  *This,
>+  IN OUT UINT64                                     **MmiTickInterval
>+  );
>+
>+///
>+/// Interface structure for the MM Periodic Timer Dispatch Protocol
>+///
>+/// This protocol provides the parent dispatch service for the periodical timer
>MMI source generator.
>+///
>+struct _EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL {
>+  EFI_MM_PERIODIC_TIMER_REGISTER    Register;
>+  EFI_MM_PERIODIC_TIMER_UNREGISTER  UnRegister;
>+  EFI_MM_PERIODIC_TIMER_INTERVAL    GetNextShorterInterval;
>+};
>+
>+extern EFI_GUID gEfiMmPeriodicTimerDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmPowerButtonDispatch.h
>b/MdePkg/Include/Protocol/MmPowerButtonDispatch.h
>new file mode 100644
>index 0000000..7f1a4e2
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmPowerButtonDispatch.h
>@@ -0,0 +1,117 @@
>+/** @file
>+  MM Power Button Dispatch Protocol as defined in PI 1.1 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides the parent dispatch service for the power button
>MMI source generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_POWER_BUTTON_DISPATCH_H_
>+#define _MM_POWER_BUTTON_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x1b1183fa, 0x1823, 0x46a7, {0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d }
>\
>+  }
>+
>+///
>+/// Power Button phases.
>+///
>+typedef enum {
>+  EfiPowerButtonEntry,
>+  EfiPowerButtonExit,
>+  EfiPowerButtonMax
>+} EFI_POWER_BUTTON_PHASE;
>+
>+///
>+/// The dispatch function's context.
>+///
>+typedef struct {
>+  ///
>+  /// Designates whether this handler should be invoked upon entry or exit.
>+  ///
>+  EFI_POWER_BUTTON_PHASE  Phase;
>+} EFI_MM_POWER_BUTTON_REGISTER_CONTEXT;
>+
>+typedef struct _EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL
>EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL;
>+
>+/**
>+  Provides the parent dispatch service for a power button event.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when an MMI is
>+  generated because the power button was pressed or released, as specified
>by RegisterContext.
>+  On return, DispatchHandle contains a unique handle which may be used
>later to unregister the
>+  function using UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer and CommBufferSize
>set to NULL.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction   Function to register for handler when
>power button is pressed or released.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>The caller fills in this context
>+                                 before calling the Register() function to indicate to the
>Register() function
>+                                 the power button MMI phase for which the dispatch
>function should be invoked.
>+  @param[out] DispatchHandle     Handle generated by the dispatcher to
>track the function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The power
>button input value
>+                                 is not within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_POWER_BUTTON_REGISTER)(
>+  IN CONST EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_MM_HANDLER_ENTRY_POINT             DispatchFunction,
>+  IN       EFI_MM_POWER_BUTTON_REGISTER_CONTEXT   *RegisterContext,
>+  OUT      EFI_HANDLE                             *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters a power-button service.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called when the standby button is pressed or released.
>+
>+  @param[in] This                Pointer to the
>EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL instance.
>+  @param[in] DispatchHandle      Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            The service has been successfully removed.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_POWER_BUTTON_UNREGISTER)(
>+  IN CONST EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                             DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM Power Button Dispatch Protocol.
>+///
>+/// This protocol provides the parent dispatch service for the power button
>MMI source generator.
>+///
>+struct _EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL {
>+  EFI_MM_POWER_BUTTON_REGISTER    Register;
>+  EFI_MM_POWER_BUTTON_UNREGISTER  UnRegister;
>+};
>+
>+extern EFI_GUID gEfiMmPowerButtonDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmReadyToLock.h
>b/MdePkg/Include/Protocol/MmReadyToLock.h
>new file mode 100644
>index 0000000..7752c71
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmReadyToLock.h
>@@ -0,0 +1,35 @@
>+/** @file
>+  MM Ready To Lock protocol introduced in the PI 1.2 specification.
>+
>+  According to PI 1.4a specification, this MM protocol indicates that
>+  MM resources and services that should not be used by the third party
>+  code are about to be locked.
>+  This protocol is a mandatory protocol published by the MM Foundation
>+  code when the system is preparing to lock certain resources and interfaces
>+  in anticipation of the invocation of 3rd party extensible modules.
>+  This protocol is an MM counterpart of the DXE MM Ready to Lock Protocol.
>+  This protocol prorogates resource locking notification into MM environment.
>+  This protocol is installed after installation of the MM End of DXE Protocol.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_READY_TO_LOCK_H_
>+#define _MM_READY_TO_LOCK_H_
>+
>+#define EFI_MM_READY_TO_LOCK_PROTOCOL_GUID \
>+  { \
>+    0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82, 0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 }
>\
>+  }
>+
>+extern EFI_GUID gEfiMmReadyToLockProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
>b/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
>new file mode 100644
>index 0000000..9f967b3
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmReportStatusCodeHandler.h
>@@ -0,0 +1,81 @@
>+/** @file
>+  This protocol provides registering and unregistering services to status code
>consumers while in DXE MM.
>+
>+  Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef __MM_REPORT_STATUS_CODE_HANDLER_PROTOCOL_H__
>+#define __MM_REPORT_STATUS_CODE_HANDLER_PROTOCOL_H__
>+
>+#define EFI_MM_RSC_HANDLER_PROTOCOL_GUID \
>+  { \
>+    0x2ff29fa7, 0x5e80, 0x4ed9, {0xb3, 0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4} \
>+  }
>+
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_RSC_HANDLER_CALLBACK)(
>+  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
>+);
>+
>+/**
>+  Register the callback function for ReportStatusCode() notification.
>+
>+  When this function is called the function pointer is added to an internal list
>and any future calls to
>+  ReportStatusCode() will be forwarded to the Callback function.
>+
>+  @param[in] Callback               A pointer to a function of type
>EFI_MM_RSC_HANDLER_CALLBACK that is
>+                                    called when a call to ReportStatusCode() occurs.
>+
>+  @retval EFI_SUCCESS               Function was successfully registered.
>+  @retval EFI_INVALID_PARAMETER     The callback function was NULL.
>+  @retval EFI_OUT_OF_RESOURCES      The internal buffer ran out of space.
>No more functions can be
>+                                    registered.
>+  @retval EFI_ALREADY_STARTED       The function was already registered. It
>can't be registered again.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_RSC_HANDLER_REGISTER)(
>+  IN EFI_MM_RSC_HANDLER_CALLBACK Callback
>+);
>+
>+/**
>+  Remove a previously registered callback function from the notification list.
>+
>+  A callback function must be unregistered before it is deallocated. It is
>important that any registered
>+  callbacks that are not runtime complaint be unregistered when
>ExitBootServices() is called.
>+
>+  @param[in] Callback           A pointer to a function of type
>EFI_MM_RSC_HANDLER_CALLBACK that is to be
>+                                unregistered.
>+
>+  @retval EFI_SUCCESS           The function was successfully unregistered.
>+  @retval EFI_INVALID_PARAMETER The callback function was NULL.
>+  @retval EFI_NOT_FOUND         The callback function was not found to be
>unregistered.
>+
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_RSC_HANDLER_UNREGISTER)(
>+  IN EFI_MM_RSC_HANDLER_CALLBACK Callback
>+);
>+
>+typedef struct _EFI_MM_RSC_HANDLER_PROTOCOL {
>+  EFI_MM_RSC_HANDLER_REGISTER      Register;
>+  EFI_MM_RSC_HANDLER_UNREGISTER    Unregister;
>+} EFI_MM_RSC_HANDLER_PROTOCOL;
>+
>+extern EFI_GUID gEfiMmRscHandlerProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
>b/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
>new file mode 100644
>index 0000000..7dcb49c
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmStandbyButtonDispatch.h
>@@ -0,0 +1,119 @@
>+/** @file
>+  MM Standby Button Dispatch Protocol as defined in PI 1.1 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides the parent dispatch service for the standby button
>MMI source generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_STANDBY_BUTTON_DISPATCH_H_
>+#define _MM_STANDBY_BUTTON_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x7300c4a1, 0x43f2, 0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b }
>\
>+  }
>+
>+///
>+/// Standby Button phases
>+///
>+typedef enum {
>+  EfiStandbyButtonEntry,
>+  EfiStandbyButtonExit,
>+  EfiStandbyButtonMax
>+} EFI_STANDBY_BUTTON_PHASE;
>+
>+///
>+/// The dispatch function's context.
>+///
>+typedef struct {
>+  ///
>+  /// Describes whether the child handler should be invoked upon the entry
>to the button
>+  /// activation or upon exit.
>+  ///
>+  EFI_STANDBY_BUTTON_PHASE  Phase;
>+} EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT;
>+
>+typedef struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL
>EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL;
>+
>+/**
>+  Provides the parent dispatch service for a standby button event.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when an MMI is
>+  generated because the standby button was pressed or released, as
>specified by
>+  RegisterContext. On return, DispatchHandle contains a unique handle which
>may be used
>+  later to unregister the function using UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer and CommBufferSize
>set to NULL.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction   Function to register for handler when the
>standby button is pressed or released.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>The caller fills in this context
>+                                 before calling the register function to indicate to the register
>function the
>+                                 standby button MMI source for which the dispatch function
>should be invoked.
>+  @param[out] DispatchHandle     Handle generated by the dispatcher to
>track the function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The standby
>button input value
>+                                 is not within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_STANDBY_BUTTON_REGISTER)(
>+  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_MM_HANDLER_ENTRY_POINT               DispatchFunction,
>+  IN       EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT   *RegisterContext,
>+  OUT      EFI_HANDLE                               *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters a child MMI source dispatch function with a parent MM driver.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called when the standby button is pressed or released.
>+
>+  @param[in] This                Pointer to the
>EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
>+  @param[in] DispatchHandle      Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            The service has been successfully removed.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_STANDBY_BUTTON_UNREGISTER)(
>+  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                               DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM Standby Button Dispatch Protocol.
>+///
>+/// This protocol provides the parent dispatch service for the standby
>+/// button MMI source generator.
>+///
>+struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL {
>+  EFI_MM_STANDBY_BUTTON_REGISTER    Register;
>+  EFI_MM_STANDBY_BUTTON_UNREGISTER  UnRegister;
>+};
>+
>+extern EFI_GUID gEfiMmStandbyButtonDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmStatusCode.h
>b/MdePkg/Include/Protocol/MmStatusCode.h
>new file mode 100644
>index 0000000..d0bfbac
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmStatusCode.h
>@@ -0,0 +1,65 @@
>+/** @file
>+  EFI MM Status Code Protocol as defined in the PI 1.2 specification.
>+
>+  This protocol provides the basic status code services while in MM.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_STATUS_CODE_H__
>+#define _MM_STATUS_CODE_H__
>+
>+
>+#define EFI_MM_STATUS_CODE_PROTOCOL_GUID \
>+  { \
>+    0x6afd2b77, 0x98c1, 0x4acd, {0xa6, 0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}
>\
>+  }
>+
>+typedef struct _EFI_MM_STATUS_CODE_PROTOCOL
>EFI_MM_STATUS_CODE_PROTOCOL;
>+
>+/**
>+  Service to emit the status code in MM.
>+
>+  The EFI_MM_STATUS_CODE_PROTOCOL.ReportStatusCode() function
>enables a driver
>+  to emit a status code while in MM.  The reason that there is a separate
>protocol definition from the
>+  DXE variant of this service is that the publisher of this protocol will provide a
>service that is
>+  capability of coexisting with a foreground operational environment, such as
>an operating system
>+  after the termination of boot services.
>+
>+  @param[in] This                Points to this instance of the
>EFI_MM_STATUS_CODE_PROTOCOL.
>+  @param[in] CodeType            DIndicates the type of status code being
>reported.
>+  @param[in] Value               Describes the current status of a hardware or
>software entity.
>+  @param[in] Instance            The enumeration of a hardware or software
>entity within the system.
>+  @param[in] CallerId            This optional parameter may be used to identify
>the caller.
>+  @param[in] Data                This optional parameter may be used to pass
>additional data.
>+
>+  @retval EFI_SUCCESS            The function completed successfully.
>+  @retval EFI_INVALID_PARAMETER  The function should not be completed
>due to a device error.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_REPORT_STATUS_CODE)(
>+  IN CONST EFI_MM_STATUS_CODE_PROTOCOL   *This,
>+  IN EFI_STATUS_CODE_TYPE                CodeType,
>+  IN EFI_STATUS_CODE_VALUE               Value,
>+  IN UINT32                              Instance,
>+  IN CONST EFI_GUID                      *CallerId,
>+  IN EFI_STATUS_CODE_DATA                *Data OPTIONAL
>+  );
>+
>+struct _EFI_MM_STATUS_CODE_PROTOCOL {
>+  EFI_MM_REPORT_STATUS_CODE  ReportStatusCode;
>+};
>+
>+extern EFI_GUID gEfiMmStatusCodeProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/Include/Protocol/MmSwDispatch.h
>b/MdePkg/Include/Protocol/MmSwDispatch.h
>new file mode 100644
>index 0000000..004c235
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmSwDispatch.h
>@@ -0,0 +1,136 @@
>+/** @file
>+  MM Software Dispatch Protocol introduced from PI 1.2 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  This protocol provides the parent dispatch service for a given MMI source
>generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_SW_DISPATCH2_H_
>+#define _MM_SW_DISPATCH2_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_SW_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x18a3c6dc, 0x5eea, 0x48c8, {0xa1, 0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 }
>\
>+  }
>+
>+///
>+/// A particular chipset may not support all possible software MMI input
>values.
>+/// For example, the ICH supports only values 00h to 0FFh.  The parent only
>allows a single
>+/// child registration for each SwMmiInputValue.
>+///
>+typedef struct {
>+  UINTN SwMmiInputValue;
>+} EFI_MM_SW_REGISTER_CONTEXT;
>+
>+///
>+/// The DispatchFunction will be called with Context set to the same value as
>was passed into
>+/// this function in RegisterContext and with CommBuffer (and
>CommBufferSize) pointing
>+/// to an instance of EFI_MM_SW_CONTEXT indicating the index of the CPU
>which generated the
>+/// software MMI.
>+///
>+typedef struct {
>+  ///
>+  /// The 0-based index of the CPU which generated the software MMI.
>+  ///
>+  UINTN SwMmiCpuIndex;
>+  ///
>+  /// This value corresponds directly to the CommandPort parameter used in
>the call to Trigger().
>+  ///
>+  UINT8 CommandPort;
>+  ///
>+  /// This value corresponds directly to the DataPort parameter used in the
>call to Trigger().
>+  ///
>+  UINT8 DataPort;
>+} EFI_MM_SW_CONTEXT;
>+
>+typedef struct _EFI_MM_SW_DISPATCH_PROTOCOL
>EFI_MM_SW_DISPATCH_PROTOCOL;
>+
>+/**
>+  Register a child MMI source dispatch function for the specified software
>MMI.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when the software
>+  MMI source specified by RegisterContext->SwMmiCpuIndex is detected.
>On return,
>+  DispatchHandle contains a unique handle which may be used later to
>unregister the function
>+  using UnRegister().
>+
>+  @param[in]  This                 Pointer to the
>EFI_MM_SW_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction     Function to register for handler when the
>specified software
>+                                   MMI is generated.
>+  @param[in, out] RegisterContext  Pointer to the dispatch function's context.
>+                                   The caller fills this context in before calling
>+                                   the register function to indicate to the register
>+                                   function which Software MMI input value the
>+                                   dispatch function should be invoked for.
>+  @param[out] DispatchHandle       Handle generated by the dispatcher to
>track the
>+                                   function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The SW driver was unable to enable the
>MMI source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The SW MMI
>input value
>+                                 is not within a valid range or is already in use.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this
>+                                 child.
>+  @retval EFI_OUT_OF_RESOURCES   A unique software MMI value could not
>be assigned
>+                                 for this dispatch.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_SW_REGISTER)(
>+  IN  CONST EFI_MM_SW_DISPATCH_PROTOCOL  *This,
>+  IN        EFI_MM_HANDLER_ENTRY_POINT   DispatchFunction,
>+  IN  OUT   EFI_MM_SW_REGISTER_CONTEXT   *RegisterContext,
>+  OUT       EFI_HANDLE                   *DispatchHandle
>+  );
>+
>+/**
>+  Unregister a child MMI source dispatch function for the specified software
>MMI.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called in response to a software MMI.
>+
>+  @param[in] This                Pointer to the EFI_MM_SW_DISPATCH_PROTOCOL
>instance.
>+  @param[in] DispatchHandle      Handle of dispatch function to deregister.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>unregistered.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_SW_UNREGISTER)(
>+  IN CONST EFI_MM_SW_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                   DispatchHandle
>+);
>+
>+///
>+/// Interface structure for the MM Software MMI Dispatch Protocol.
>+///
>+/// The EFI_MM_SW_DISPATCH2_PROTOCOL provides the ability to install
>child handlers for the
>+/// given software.  These handlers will respond to software interrupts, and
>the maximum software
>+/// interrupt in the EFI_MM_SW_REGISTER_CONTEXT is denoted by
>MaximumSwiValue.
>+///
>+struct _EFI_MM_SW_DISPATCH_PROTOCOL {
>+  EFI_MM_SW_REGISTER    Register;
>+  EFI_MM_SW_UNREGISTER  UnRegister;
>+  ///
>+  /// A read-only field that describes the maximum value that can be used in
>the
>+  /// EFI_MM_SW_DISPATCH_PROTOCOL.Register() service.
>+  ///
>+  UINTN                 MaximumSwiValue;
>+};
>+
>+extern EFI_GUID gEfiMmSwDispatchProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmSxDispatch.h
>b/MdePkg/Include/Protocol/MmSxDispatch.h
>new file mode 100644
>index 0000000..af63389
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmSxDispatch.h
>@@ -0,0 +1,135 @@
>+/** @file
>+  MM Sx Dispatch Protocol as defined in PI 1.2 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  Provides the parent dispatch service for a given Sx-state source generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+**/
>+
>+#ifndef _MM_SX_DISPATCH_H_
>+#define _MM_SX_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_SX_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0x456d2859, 0xa84b, 0x4e47, {0xa2, 0xee, 0x32, 0x76, 0xd8, 0x86, 0x99,
>0x7d } \
>+  }
>+
>+///
>+/// Sleep states S0-S5
>+///
>+typedef enum {
>+  SxS0,
>+  SxS1,
>+  SxS2,
>+  SxS3,
>+  SxS4,
>+  SxS5,
>+  EfiMaximumSleepType
>+} EFI_SLEEP_TYPE;
>+
>+///
>+/// Sleep state phase: entry or exit
>+///
>+typedef enum {
>+  SxEntry,
>+  SxExit,
>+  EfiMaximumPhase
>+} EFI_SLEEP_PHASE;
>+
>+///
>+/// The dispatch function's context
>+///
>+typedef struct {
>+  EFI_SLEEP_TYPE  Type;
>+  EFI_SLEEP_PHASE Phase;
>+} EFI_MM_SX_REGISTER_CONTEXT;
>+
>+typedef struct _EFI_MM_SX_DISPATCH_PROTOCOL
>EFI_MM_SX_DISPATCH_PROTOCOL;
>+
>+/**
>+  Provides the parent dispatch service for a given Sx source generator.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when the sleep state
>+  event specified by RegisterContext is detected. On return, DispatchHandle
>contains a
>+  unique handle which may be used later to unregister the function using
>UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer and CommBufferSize
>set to
>+  NULL and 0 respectively.
>+
>+  @param[in] This                Pointer to the EFI_MM_SX_DISPATCH_PROTOCOL
>instance.
>+  @param[in] DispatchFunction    Function to register for handler when the
>specified sleep state event occurs.
>+  @param[in] RegisterContext     Pointer to the dispatch function's context.
>+                                 The caller fills this context in before calling
>+                                 the register function to indicate to the register
>+                                 function which Sx state type and phase the caller
>+                                 wishes to be called back on. For this intertace,
>+                                 the Sx driver will call the registered handlers for
>+                                 all Sx type and phases, so the Sx state handler(s)
>+                                 must check the Type and Phase field of the Dispatch
>+                                 context and act accordingly.
>+  @param[out]  DispatchHandle    Handle of dispatch function, for when
>interfacing
>+                                 with the parent Sx state MM driver.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_UNSUPPORTED        The Sx driver or hardware does not support
>that
>+                                 Sx Type/Phase.
>+  @retval EFI_DEVICE_ERROR       The Sx driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. Type & Phase
>are not
>+                                 within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this
>+                                 child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_SX_REGISTER)(
>+  IN  CONST EFI_MM_SX_DISPATCH_PROTOCOL  *This,
>+  IN        EFI_MM_HANDLER_ENTRY_POINT   DispatchFunction,
>+  IN  CONST EFI_MM_SX_REGISTER_CONTEXT   *RegisterContext,
>+  OUT       EFI_HANDLE                   *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters an Sx-state service.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called in response to sleep event.
>+
>+  @param[in] This                Pointer to the EFI_MM_SX_DISPATCH_PROTOCOL
>instance.
>+  @param[in] DispatchHandle      Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            The service has been successfully removed.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_SX_UNREGISTER)(
>+  IN CONST EFI_MM_SX_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                   DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM Sx Dispatch Protocol
>+///
>+/// The EFI_MM_SX_DISPATCH_PROTOCOL provides the ability to install
>child handlers to
>+/// respond to sleep state related events.
>+///
>+struct _EFI_MM_SX_DISPATCH_PROTOCOL {
>+  EFI_MM_SX_REGISTER    Register;
>+  EFI_MM_SX_UNREGISTER  UnRegister;
>+};
>+
>+extern EFI_GUID gEfiMmSxDispatchProtocolGuid;
>+
>+#endif
>diff --git a/MdePkg/Include/Protocol/MmUsbDispatch.h
>b/MdePkg/Include/Protocol/MmUsbDispatch.h
>new file mode 100644
>index 0000000..0b4fabe
>--- /dev/null
>+++ b/MdePkg/Include/Protocol/MmUsbDispatch.h
>@@ -0,0 +1,130 @@
>+/** @file
>+  MM USB Dispatch Protocol as defined in PI 1.1 Specification
>+  Volume 4 Management Mode Core Interface.
>+
>+  Provides the parent dispatch service for the USB MMI source generator.
>+
>+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
>+  This program and the accompanying materials
>+  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
>+  http://opensource.org/licenses/bsd-license.php
>+
>+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>+
>+  @par Revision Reference:
>+  This protocol is from PI Version 1.1.
>+
>+**/
>+
>+#ifndef _MM_USB_DISPATCH_H_
>+#define _MM_USB_DISPATCH_H_
>+
>+#include <Pi/PiMmCis.h>
>+
>+#define EFI_MM_USB_DISPATCH_PROTOCOL_GUID \
>+  { \
>+    0xee9b8d90, 0xc5a6, 0x40a2, {0xbd, 0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc,
>0xa1 } \
>+  }
>+
>+///
>+/// USB MMI event types
>+///
>+typedef enum {
>+  UsbLegacy,
>+  UsbWake
>+} EFI_USB_MMI_TYPE;
>+
>+///
>+/// The dispatch function's context.
>+///
>+typedef struct {
>+  ///
>+  /// Describes whether this child handler will be invoked in response to a
>USB legacy
>+  /// emulation event, such as port-trap on the PS/2* keyboard control
>registers, or to a
>+  /// USB wake event, such as resumption from a sleep state.
>+  ///
>+  EFI_USB_MMI_TYPE          Type;
>+  ///
>+  /// The device path is part of the context structure and describes the
>location of the
>+  /// particular USB host controller in the system for which this register event
>will occur.
>+  /// This location is important because of the possible integration of several
>USB host
>+  /// controllers in a system.
>+  ///
>+  EFI_DEVICE_PATH_PROTOCOL  *Device;
>+} EFI_MM_USB_REGISTER_CONTEXT;
>+
>+typedef struct _EFI_MM_USB_DISPATCH_PROTOCOL
>EFI_MM_USB_DISPATCH_PROTOCOL;
>+
>+/**
>+  Provides the parent dispatch service for the USB MMI source generator.
>+
>+  This service registers a function (DispatchFunction) which will be called
>when the USB-
>+  related MMI specified by RegisterContext has occurred. On return,
>DispatchHandle
>+  contains a unique handle which may be used later to unregister the
>function using UnRegister().
>+  The DispatchFunction will be called with Context set to the same value as
>was passed into
>+  this function in RegisterContext and with CommBuffer containing NULL and
>+  CommBufferSize containing zero.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_USB_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchFunction   Function to register for handler when a
>USB-related MMI occurs.
>+  @param[in]  RegisterContext    Pointer to the dispatch function's context.
>+                                 The caller fills this context in before calling
>+                                 the register function to indicate to the register
>+                                 function the USB MMI types for which the dispatch
>+                                 function should be invoked.
>+  @param[out] DispatchHandle     Handle generated by the dispatcher to
>track the function instance.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 registered and the MMI source has been enabled.
>+  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI
>source.
>+  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The USB MMI
>type
>+                                 is not within valid range.
>+  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system
>or MM) to manage this child.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_USB_REGISTER)(
>+  IN  CONST EFI_MM_USB_DISPATCH_PROTOCOL  *This,
>+  IN        EFI_MM_HANDLER_ENTRY_POINT    DispatchFunction,
>+  IN  CONST EFI_MM_USB_REGISTER_CONTEXT   *RegisterContext,
>+  OUT       EFI_HANDLE                    *DispatchHandle
>+  );
>+
>+/**
>+  Unregisters a USB service.
>+
>+  This service removes the handler associated with DispatchHandle so that it
>will no longer be
>+  called when the USB event occurs.
>+
>+  @param[in]  This               Pointer to the
>EFI_MM_USB_DISPATCH_PROTOCOL instance.
>+  @param[in]  DispatchHandle     Handle of the service to remove.
>+
>+  @retval EFI_SUCCESS            The dispatch function has been successfully
>+                                 unregistered and the MMI source has been disabled
>+                                 if there are no other registered child dispatch
>+                                 functions for this MMI source.
>+  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
>+**/
>+typedef
>+EFI_STATUS
>+(EFIAPI *EFI_MM_USB_UNREGISTER)(
>+  IN CONST EFI_MM_USB_DISPATCH_PROTOCOL  *This,
>+  IN       EFI_HANDLE                    DispatchHandle
>+  );
>+
>+///
>+/// Interface structure for the MM USB MMI Dispatch Protocol
>+///
>+/// This protocol provides the parent dispatch service for the USB MMI
>source generator.
>+///
>+struct _EFI_MM_USB_DISPATCH_PROTOCOL {
>+  EFI_MM_USB_REGISTER    Register;
>+  EFI_MM_USB_UNREGISTER  UnRegister;
>+};
>+
>+extern EFI_GUID gEfiMmUsbDispatchProtocolGuid;
>+
>+#endif
>+
>diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
>index f54b056..ace4df3 100644
>--- a/MdePkg/MdePkg.dec
>+++ b/MdePkg/MdePkg.dec
>@@ -1033,6 +1033,9 @@
>   ## Include/Protocol/SmmReportStatusCodeHandler.h
>   gEfiSmmRscHandlerProtocolGuid   = { 0x2ff29fa7, 0x5e80, 0x4ed9, { 0xb3,
>0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4 }}
>
>+  ## Include/Protocol/MmReportStatusCodeHandler.h
>+  gEfiMmRscHandlerProtocolGuid   = { 0x2ff29fa7, 0x5e80, 0x4ed9, { 0xb3,
>0x80, 0x1, 0x7d, 0x3c, 0x55, 0x4f, 0xf4 }}
>+
>   ## Include/Protocol/AcpiSystemDescriptionTable.h
>   gEfiAcpiSdtProtocolGuid         = { 0xeb97088e, 0xcfdf, 0x49c6, { 0xbe, 0x4b,
>0xd9, 0x6, 0xa5, 0xb2, 0xe, 0x86 }}
>
>@@ -1042,60 +1045,117 @@
>   ## Include/Protocol/SmmCpuIo2.h
>   gEfiSmmCpuIo2ProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d,
>0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}
>
>+  ## Include/Protocol/MmCpuIo.h
>+  gEfiMmCpuIoProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d,
>0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}
>+
>   ## Include/Protocol/SmmBase2.h
>   gEfiSmmBase2ProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4,
>0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}
>
>+  ## Include/Protocol/MmBase.h
>+  gEfiMmBaseProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4,
>0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}
>+
>   ## Include/Protocol/SmmAccess2.h
>   gEfiSmmAccess2ProtocolGuid      = { 0xc2702b74, 0x800c, 0x4131, { 0x87, 0x46,
>0x8f, 0xb5, 0xb8, 0x9c, 0xe4, 0xac }}
>
>+  ## Include/Protocol/MmAccess.h
>+  gEfiMmAccessProtocolGuid      = { 0xc2702b74, 0x800c, 0x4131, { 0x87, 0x46,
>0x8f, 0xb5, 0xb8, 0x9c, 0xe4, 0xac }}
>+
>   ## Include/Protocol/SmmControl2.h
>   gEfiSmmControl2ProtocolGuid     = { 0x843dc720, 0xab1e, 0x42cb, { 0x93, 0x57,
>0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}}
>
>+  ## Include/Protocol/MmControl.h
>+  gEfiMmControlProtocolGuid     = { 0x843dc720, 0xab1e, 0x42cb, { 0x93, 0x57,
>0x8a, 0x0, 0x78, 0xf3, 0x56, 0x1b}}
>+
>   ## Include/Protocol/SmmConfiguration.h
>   gEfiSmmConfigurationProtocolGuid= { 0x26eeb3de, 0xb689, 0x492e, { 0x80,
>0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b, 0xa7 }}
>
>+  ## Include/Protocol/MmConfiguration.h
>+  gEfiMmConfigurationProtocolGuid= { 0x26eeb3de, 0xb689, 0x492e, { 0x80,
>0xf0, 0xbe, 0x8b, 0xd7, 0xda, 0x4b, 0xa7 }}
>+
>   ## Include/Protocol/SmmReadyToLock.h
>   gEfiSmmReadyToLockProtocolGuid  = { 0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82,
>0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 }}
>
>+  ## Include/Protocol/MmReadyToLock.h
>+  gEfiMmReadyToLockProtocolGuid  = { 0x47b7fa8c, 0xf4bd, 0x4af6, { 0x82,
>0x00, 0x33, 0x30, 0x86, 0xf0, 0xd2, 0xc8 }}
>+
>   ## Include/Protocol/DxeSmmReadyToLock.h
>   gEfiDxeSmmReadyToLockProtocolGuid = { 0x60ff8964, 0xe906, 0x41d0, { 0xaf,
>0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0, 0x8e }}
>
>+  ## Include/Protocol/DxeMmReadyToLock.h
>+  gEfiDxeMmReadyToLockProtocolGuid = { 0x60ff8964, 0xe906, 0x41d0, { 0xaf,
>0xed, 0xf2, 0x41, 0xe9, 0x74, 0xe0, 0x8e }}
>+
>   ## Include/Protocol/SmmCommunication.h
>   gEfiSmmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd,
>{ 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
>
>+  ## Include/Protocol/MmCommunication.h
>+  gEfiMmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd,
>{ 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
>+
>   ## Include/Protocol/SmmStatusCode.h
>   gEfiSmmStatusCodeProtocolGuid   = { 0x6afd2b77, 0x98c1, 0x4acd, { 0xa6,
>0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}}
>
>+  ## Include/Protocol/MmStatusCode.h
>+  gEfiMmStatusCodeProtocolGuid   = { 0x6afd2b77, 0x98c1, 0x4acd, { 0xa6,
>0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}}
>+
>   ## Include/Protocol/SmmCpu.h
>   gEfiSmmCpuProtocolGuid          = { 0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22,
>0xf8, 0xe9, 0x2b, 0xb3, 0xd5, 0x69 }}
>
>+  ## Include/Protocol/MmCpu.h
>+  gEfiMmCpuProtocolGuid          = { 0xeb346b97, 0x975f, 0x4a9f, { 0x8b, 0x22,
>0xf8, 0xe9, 0x2b, 0xb3, 0xd5, 0x69 }}
>+
>   ## Include/Protocol/SmmPciRootBridgeIo.h
>   gEfiSmmPciRootBridgeIoProtocolGuid = { 0x8bc1714d, 0xffcb, 0x41c3, { 0x89,
>0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98, 0xea }}
>
>+  ## Include/Protocol/MmPciRootBridgeIo.h
>+  gEfiMmPciRootBridgeIoProtocolGuid = { 0x8bc1714d, 0xffcb, 0x41c3, { 0x89,
>0xdc, 0x6c, 0x74, 0xd0, 0x6d, 0x98, 0xea }}
>+
>   ## Include/Protocol/SmmSwDispatch2.h
>   gEfiSmmSwDispatch2ProtocolGuid  = { 0x18a3c6dc, 0x5eea, 0x48c8, {0xa1,
>0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 }}
>
>+  ## Include/Protocol/MmSwDispatch.h
>+  gEfiMmSwDispatchProtocolGuid  = { 0x18a3c6dc, 0x5eea, 0x48c8, {0xa1,
>0xc1, 0xb5, 0x33, 0x89, 0xf9, 0x89, 0x99 }}
>+
>   ## Include/Protocol/SmmSxDispatch2.h
>   gEfiSmmSxDispatch2ProtocolGuid  = { 0x456d2859, 0xa84b, 0x4e47, {0xa2,
>0xee, 0x32, 0x76, 0xd8, 0x86, 0x99, 0x7d }}
>
>+  ## Include/Protocol/MmSxDispatch.h
>+  gEfiMmSxDispatchProtocolGuid  = { 0x456d2859, 0xa84b, 0x4e47, {0xa2,
>0xee, 0x32, 0x76, 0xd8, 0x86, 0x99, 0x7d }}
>+
>   ## Include/Protocol/SmmPeriodicTimerDispatch2.h
>   gEfiSmmPeriodicTimerDispatch2ProtocolGuid = { 0x4cec368e, 0x8e8e,
>0x4d71, {0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a, 0x53 }}
>
>+  ## Include/Protocol/MmPeriodicTimerDispatch.h
>+  gEfiMmPeriodicTimerDispatchProtocolGuid = { 0x4cec368e, 0x8e8e, 0x4d71,
>{0x8b, 0xe1, 0x95, 0x8c, 0x45, 0xfc, 0x8a, 0x53 }}
>+
>   ## Include/Protocol/SmmUsbDispatch2.h
>   gEfiSmmUsbDispatch2ProtocolGuid = { 0xee9b8d90, 0xc5a6, 0x40a2, {0xbd,
>0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc, 0xa1 }}
>
>+  ## Include/Protocol/MmUsbDispatch.h
>+  gEfiMmUsbDispatchProtocolGuid = { 0xee9b8d90, 0xc5a6, 0x40a2, {0xbd,
>0xe2, 0x52, 0x55, 0x8d, 0x33, 0xcc, 0xa1 }}
>+
>   ## Include/Protocol/SmmGpiDispatch2.h
>   gEfiSmmGpiDispatch2ProtocolGuid = { 0x25566b03, 0xb577, 0x4cbf, {0x95,
>0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43, 0x80 }}
>
>+  ## Include/Protocol/MmGpiDispatch.h
>+  gEfiMmGpiDispatchProtocolGuid = { 0x25566b03, 0xb577, 0x4cbf, {0x95,
>0x8c, 0xed, 0x66, 0x3e, 0xa2, 0x43, 0x80 }}
>+
>   ## Include/Protocol/SmmStandbyButtonDispatch2.h
>   gEfiSmmStandbyButtonDispatch2ProtocolGuid = { 0x7300c4a1, 0x43f2,
>0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b }}
>
>+  ## Include/Protocol/MmStandbyButtonDispatch.h
>+  gEfiMmStandbyButtonDispatchProtocolGuid = { 0x7300c4a1, 0x43f2, 0x4017,
>{0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b }}
>+
>   ## Include/Protocol/SmmPowerButtonDispatch2.h
>   gEfiSmmPowerButtonDispatch2ProtocolGuid = { 0x1b1183fa, 0x1823, 0x46a7,
>{0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d }}
>
>+  ## Include/Protocol/MmPowerButtonDispatch.h
>+  gEfiMmPowerButtonDispatchProtocolGuid = { 0x1b1183fa, 0x1823, 0x46a7,
>{0x88, 0x72, 0x9c, 0x57, 0x87, 0x55, 0x40, 0x9d }}
>+
>   ## Include/Protocol/SmmIoTrapDispatch2.h
>   gEfiSmmIoTrapDispatch2ProtocolGuid = { 0x58dc368d, 0x7bfa, 0x4e77, {0xab,
>0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 }}
>
>+  ## Include/Protocol/MmIoTrapDispatch.h
>+  gEfiMmIoTrapDispatchProtocolGuid = { 0x58dc368d, 0x7bfa, 0x4e77, {0xab,
>0xbc, 0xe, 0x29, 0x41, 0x8d, 0xf9, 0x30 }}
>+
>   ## Include/Protocol/PiPcd.h
>   gEfiPcdProtocolGuid = { 0x13a3f0f6, 0x264a, 0x3ef0, { 0xf2, 0xe0, 0xde, 0xc5,
>0x12, 0x34, 0x2f, 0x34 } }
>
>@@ -1141,6 +1201,9 @@
>   ## Include/Protocol/SmmEndOfDxe.h
>   gEfiSmmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39,
>0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
>
>+  ## Include/Protocol/MmEndOfDxe.h
>+  gEfiMmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39,
>0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
>+
>   ## Include/Protocol/IsaHc.h
>   gEfiIsaHcProtocolGuid               = { 0xbcdaf080, 0x1bde, 0x4e22, {0xae, 0x6a,
>0x43, 0x54, 0x1e, 0x12, 0x8e, 0xc4 } }
>   gEfiIsaHcServiceBindingProtocolGuid = { 0xfad7933a, 0x6c21, 0x4234, {0xa4,
>0x34, 0x0a, 0x8a, 0x0d, 0x2b, 0x07, 0x81 } }
>--
>2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel