***
PI v1.5 Specification Volume 4 defines Management Mode Core Interface
and defines EFI_MM_COMMUNICATION_PROTOCOL. This protocol provides a
means of communicating between drivers outside of MM and MMI
handlers inside of MM.
EFI_MM_COMMUNICATION_PROTOCOL
Summary
This protocol provides a means of communicating between drivers outside of MM
and MMI
handlers inside of MM.
GUID
#define EFI_MM_COMMUNICATION_PROTOCOL_GUID \
{ 0xc68ed8e2, 0x9dc6, 0x4cbd, 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }
Prototype
typedef struct _EFI_MM_COMMUNICATION_PROTOCOL {
EFI_MM_COMMUNICATE Communicate;
} EFI_MM_COMMUNICATION_PROTOCOL;
Members
Communicate
Sends/receives a message for a registered handler. See the Communicate()
function description.
Description
This protocol provides runtime services for communicating between DXE drivers
and a registered
MMI handler.
EFI_MM_COMMUNICATION_PROTOCOL.Communicate()
Summary
Communicates with a registered handler.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_MM_COMMUNICATE) (
IN CONST EFI_MM_COMMUNICATION_PROTOCOL *This,
IN OUT VOID *CommBuffer,
IN OUT UINTN *CommSize OPTIONAL
);
Parameters
This - The EFI_MM_COMMUNICATION_PROTOCOL instance.
CommBuffer - Pointer to the buffer to convey into MMRAM.
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.
This parameter is optional
and may be NULL.
Description
This function provides a service to send and receive messages from a
registered UEFI service. The EFI_MM_COMMUNICATION_PROTOCOL driver is
responsible for doing any of the
copies such that the data lives in boot-service-accessible RAM.
A given implementation of the EFI_MM_COMMUNICATION_PROTOCOL may choose to use
the EFI_MM_CONTROL_PROTOCOL for effecting the mode transition, or it may use
some other method.
The agent invoking the communication interface at runtime may be virtually
mapped. The MM infrastructure code and handlers, on the other hand, execute in
physical mode. As a result, the non-MM agent,
which may be executing in the virtual-mode OS context (as a result of an OS
invocation of the UEFI SetVirtualAddressMap() service), should use a contiguous
memory buffer with a physical address before
invoking this service. If the virtual address of the buffer is used, the MM
Driver may not know how to do the appropriate virtual-to-physical conversion.
To avoid confusion in interpreting frames, the CommunicateBuffer parameter
should always begin with EFI_MM_COMMUNICATE_HEADER, which is defined in Related
Definitions below.
The header data is mandatory for messages sent into the MM agent.
If the CommSize parameter is omitted the MessageLength field in the
EFI_MM_COMMUNICATE_HEADER,
in conjunction with the size of the header itself, can be used to ascertain
the total size of the communication payload.
If the MessageLength is zero, or too large for the MM implementation to
manage, the MM implementation must update the MessageLength to reflect the size
of the Data buffer that it can tolerate.
If the CommSize parameter is passed into the call, but the integer it points
to, has a value of 0, then this must be updated to reflect the maximum size of
the CommBuffer that the implementation can tolerate.
Once inside of MM, the MM infrastructure will call all registered handlers
with the same HandlerType as the GUID specified by HeaderGuid and the
CommBuffer pointing to Data.
This function is not reentrant.
The standard header is used at the beginning of the
EFI_MM_INITIALIATION_HEADER structure during MM initialization. See "Related
Definitions" below for more information.
Related Definitions
typedef struct {
EFI_GUID HeaderGuid;
UINTN MessageLength;
UINT8 Data[ANYSIZE_ARRAY];
} EFI_MM_COMMUNICATE_HEADER;
HeaderGuid - Allows for disambiguation of the message format. Type EFI_GUID
is defined in
InstallProtocolInterface() in the UEFI Specification.
MessageLength - Describes the size of Data (in bytes) and does not include
the size of the header.
Data - Designates an array of bytes that is MessageLength in size.
Status Codes Returned
EFI_SUCCESS - The message was successfully posted.
EFI_INVALID_PARAMETER - The buffer was NULL.
EFI_BAD_BUFFER_SIZE - The buffer is too large for the MM implementation. If
this error is
returned, the MessageLength field in
the CommBuffer
header or the integer pointed by
CommSize, are updated to reflect
the maximum payload size the
implementation can accommodate.
See the function description above
for more details.
EFI_ACCESS_DENIED - The CommunicateBuffer parameter or CommSize
parameter, if not omitted, are in
address range that cannot be
accessed by the MM environment.
This patchset implements it on AARCH64 Platform.
***
Supreeth Venkatesh (3):
ArmPkg/Drivers: Add EFI_MM_COMMUNICATION_PROTOCOL DXE driver.
ArmPkg/Drivers: Add ArmMmCommunication Driver information file.
ArmPkg: Add PCDs needed for MM communication driver.
ArmPkg/ArmPkg.dec | 3 +
.../Drivers/MmCommunicationDxe/MmCommunication.c | 314 +++++++++++++++++++++
.../Drivers/MmCommunicationDxe/MmCommunication.inf | 50 ++++
3 files changed, 367 insertions(+)
create mode 100644 ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
create mode 100644 ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
--
2.14.1
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel