blob: 979bf16585e8238cb980edb2b8728bd67b716504 [file] [log] [blame]
/** @file
Memory management protocol definitions as specified in the FF-A Memory Management
v1.3 APL1 specification.
Copyright 2021 The Hafnium Authors.
Copyright (c), Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Glossary:
- FF-A - Firmware Framework for Arm A-profile
@par Reference(s):
- FF-A Version 1.3 ALP1 [https://developer.arm.com/documentation/den0077/l]
- FF-A Memory Management Protocol 1.3 ALP1 [https://developer.arm.com/documentation/den0140/f]
**/
#ifndef ARM_FFA_MEM_MGMT_H_
#define ARM_FFA_MEM_MGMT_H_
/**
Data access attributes in a memory access permission descriptor. This corresponds
to table 1.15 of the FF-A v1.3 APL1, "Memory access permissions descriptor",
bits[1:0].
**/
#define FFA_DATA_ACCESS_NOT_SPECIFIED 0
#define FFA_DATA_ACCESS_RO 1
#define FFA_DATA_ACCESS_RW 2
#define FFA_DATA_ACCESS_RESERVED 3
/**
Instruction access attributes in a memory access permission descriptor.
This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory
access permissions descriptor", bits[3:2].
**/
#define FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED 0
#define FFA_INSTRUCTION_ACCESS_NX 1
#define FFA_INSTRUCTION_ACCESS_X 2
#define FFA_INSTRUCTION_ACCESS_RESERVED 3
/**
Memory access permission struct definition of memory access permissions descriptor.
This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor".
**/
typedef struct {
UINT8 DataAccess : 2;
UINT8 InstructionAccess : 2;
UINT8 Reservd : 4;
} FFA_MEMORY_ACCESS_PERMISSIONS;
/**
Memory shareability attributes in a memory region attributes descriptor.
This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor", bits[1:0].
**/
#define FFA_MEMORY_SHARE_NON_SHAREABLE 0
#define FFA_MEMORY_SHARE_RESERVED 1
#define FFA_MEMORY_OUTER_SHAREABLE 2
#define FFA_MEMORY_INNER_SHAREABLE 3
/**
Memory cacheability or device memory attributes in a memory region attributes
descriptor.
This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor", bits[3:2].
**/
#define FFA_MEMORY_CACHE_RESERVED 0x0
#define FFA_MEMORY_CACHE_NON_CACHEABLE 0x1
#define FFA_MEMORY_CACHE_RESERVED_1 0x2
#define FFA_MEMORY_CACHE_WRITE_BACK 0x3
#define FFA_MEMORY_DEV_NGNRNE 0x0
#define FFA_MEMORY_DEV_NGNRE 0x1
#define FFA_MEMORY_DEV_NGRE 0x2
#define FFA_MEMORY_DEV_GRE 0x3
/**
Memory type in a memory region attributes descriptor.
This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor", bits[5:4].
**/
#define FFA_MEMORY_NOT_SPECIFIED_MEM 0
#define FFA_MEMORY_DEVICE_MEM 1
#define FFA_MEMORY_NORMAL_MEM 2
/**
FF-A Memory Management v1.3 APL1 Table 1.18 "Memory region attributes descriptor"
bits[6]. Per section 1.10.4.1, NS bit is reserved for FFA_MEM_DONATE/LEND/SHARE
and FFA_MEM_RETRIEVE_REQUEST.
**/
#define FFA_MEMORY_SECURITY_SECURE 0
#define FFA_MEMORY_SECURITY_NON_SECURE 1
/**
Reserved bits (SBZ) of a memory region attributes descriptor.
This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor", bits[15:7].
**/
#define FFA_MEMORY_ATTRIBUTES_MBZ_MASK 0xFF80U
/**
Memory region attributes struct definition of memory region attribute descriptor.
This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory
region attributes descriptor".
**/
typedef struct {
UINT16 Shareability : 2;
UINT16 Cacheability : 2;
UINT16 Type : 2;
UINT16 Security : 1;
UINT16 Reserved : 9;
} FFA_MEMORY_ATTRIBUTES;
/**
A set of contiguous pages which is part of a memory region.
This corresponds to table 1.14 of the the FF-A Memory Management v1.3 APL1, "Constituent
memory region descriptor".
**/
typedef struct {
/**
The base IPA of the constituent memory region, aligned to 4 kiB page
size granularity.
**/
UINT64 Address;
/** The number of 4 kiB pages in the constituent memory region. **/
UINT32 PageCount;
/** Reserved field, SBZ. **/
UINT32 Reserved;
} FFA_MEMORY_REGION_CONSTITUENT;
/**
A set of pages comprising a memory region.
This corresponds to table 1.13 of the FF-A Memory Management v1.3 APL1, "Composite
memory region descriptor".
**/
typedef struct {
/**
The total number of 4 kiB pages included in this memory region. This
must be equal to the sum of page counts specified in each
`FFA_MEMORY_REGION_CONSTITUENT`.
**/
UINT32 TotalPageCount;
/**
The number of constituents (`FFA_MEMORY_REGION_CONSTITUENT`)
included in this memory region range.
**/
UINT32 ConstituentCount;
/** Reserved field, SBZ. */
UINT64 Reserved;
/** An array of `ConstituentCount` memory region constituents. */
FFA_MEMORY_REGION_CONSTITUENT Constituents[];
} FFA_COMPOSITE_MEMORY_REGION;
/**
Flags to indicate properties of memory management ABI being invoked.
This corresponds to table 1.17 of the FF-A Memory Management v1.3 APL1, "Flags
Flags usage in FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP ABIs", Bit[0].
**/
#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_MASK ((0x1U) << 0)
#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_UNSPECIFIED ((0x0U) << 0)
#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_RETRIEVAL ((0x0U) << 0)
#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_NON_RETRIEVAL ((0x1U) << 0)
/**
Memory region attributes descriptor.
This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory
access permissions descriptor".
**/
typedef struct {
/** The ID of the VM to which the memory is being given or shared. **/
UINT16 ReceiverId;
/**
The permissions with which the memory region should be mapped in the
receiver's page table.
**/
FFA_MEMORY_ACCESS_PERMISSIONS Permissions;
/**
Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP
for memory regions with multiple borrowers.
**/
UINT8 Flags;
} FFA_MEMORY_ACCESS_PERMISSIONS_DESCRIPTOR;
/**
Endpoint memory access descriptor.
This corresponds to table 1.16 of the FF-A Memory Management v1.3 APL1, "Endpoint
memory access descriptor".
**/
typedef struct {
FFA_MEMORY_ACCESS_PERMISSIONS_DESCRIPTOR ReceiverPermissions;
/**
Offset in bytes from the start of the outer `FFA_MEMORY_TRANSACTION_DESCRIPTOR` to
an `FFA_COMPOSITE_MEMORY_REGION` struct.
**/
UINT32 CompositeMemoryRegionOffset;
UINT8 ImplementationDefined[16];
UINT64 Reserved;
} FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR;
/**
Clear memory region contents after unmapping it from the sender and before
mapping it for any receiver.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[0].
**/
#define FFA_MEMORY_REGION_FLAG_CLEAR 0x1
/**
Whether the hypervisor may time slice the memory sharing or retrieval
operation.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[1].
**/
#define FFA_MEMORY_REGION_FLAG_TIME_SLICE 0x2
/**
Whether the hypervisor should clear the memory region after the receiver
relinquishes it or is aborted.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[2].
**/
#define FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH 0x4
/**
Transaction type for memory region retrieval.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[3].
**/
#define FFA_MEMORY_REGION_TRANSACTION_TYPE_MASK ((0x3U) << 3)
#define FFA_MEMORY_REGION_TRANSACTION_TYPE_UNSPECIFIED ((0x0U) << 3)
#define FFA_MEMORY_REGION_TRANSACTION_TYPE_SHARE ((0x1U) << 3)
#define FFA_MEMORY_REGION_TRANSACTION_TYPE_LEND ((0x2U) << 3)
#define FFA_MEMORY_REGION_TRANSACTION_TYPE_DONATE ((0x3U) << 3)
/**
Address range hint for memory region retrieval.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[9:5].
**/
#define FFA_MEMORY_REGION_ADDRESS_RANGE_HINT_VALID ((0x1U) << 9)
#define FFA_MEMORY_REGION_ADDRESS_RANGE_HINT_MASK ((0xFU) << 5)
/**
On retrieve request, bypass the multi-borrower check.
This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags
usage in FFA_MEM_RETRIEVE_REQ ABI", bits[10].
**/
#define FFA_MEMORY_REGION_FLAG_BYPASS_BORROWERS_CHECK (0x1U << 10)
/**
Information about a set of pages which are being shared.
This corresponds to table 1.20 of the FF-A Memory Management v1.3 APL1, "Memory
transaction descriptor". Note that it is also used for retrieve requests and responses.
**/
typedef struct {
/**
The ID of the VM which originally sent the memory region, i.e. the
owner.
**/
UINT16 SenderId;
FFA_MEMORY_ATTRIBUTES Attributes;
/** Flags to control behaviour of the transaction. **/
UINT32 Flags;
UINT64 Handle;
/**
An implementation defined value associated with the receiver and the
memory region.
**/
UINT64 Tag;
/** Size of the memory access descriptor. **/
UINT32 MemoryAccessDescSize;
/**
The number of `FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR` entries included in this
transaction.
**/
UINT32 ReceiverCount;
/**
Offset to the 'FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR' field, which relates to
the memory access descriptors.
**/
UINT32 ReceiversOffset;
/** Reserved field (12 bytes) SBZ. */
UINT8 Reserved[12];
} FFA_MEMORY_TRANSACTION_DESCRIPTOR;
/**
Descriptor used for FFA_MEM_RELINQUISH requests. This corresponds to table
2.25 of the FF-A Memory Management v1.3 APL1, "Descriptor to relinquish a memory
region".
**/
typedef struct {
UINT64 Handle;
UINT32 Flags;
UINT32 EndpointCount;
UINT16 Endpoints[];
} FFA_MEM_RELINQUISH_DESCRIPTOR;
#endif