public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Eric Dong <eric.dong@intel.com>
To: edk2-devel@lists.01.org
Cc: Michael D Kinney <michael.d.kinney@intel.com>,
	Liming Gao <liming.gao@intel.com>
Subject: [Patch 1/2] MdePkg: Add new definitions for Management Mode.
Date: Mon, 14 Aug 2017 16:32:35 +0800	[thread overview]
Message-ID: <1502699556-15964-2-git-send-email-eric.dong@intel.com> (raw)
In-Reply-To: <1502699556-15964-1-git-send-email-eric.dong@intel.com>

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



  reply	other threads:[~2017-08-14  8:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-14  8:32 [Patch 0/2] Add Management Mode infrastructure support Eric Dong
2017-08-14  8:32 ` Eric Dong [this message]
2017-08-25  9:30   ` [Patch 1/2] MdePkg: Add new definitions for Management Mode Gao, Liming
2017-08-14  8:32 ` [Patch 2/2] MdePkg: Update exited SMM related definition Eric Dong
  -- strict thread matches above, loose matches on Subject: below --
2017-08-28  6:40 [Patch v2 0/2] Add Management Mode infrastructure support Eric Dong
2017-08-28  6:40 ` [Patch 1/2] MdePkg: Add new definitions for Management Mode Eric Dong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1502699556-15964-2-git-send-email-eric.dong@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox