blob: 0b7c9372f2bdd00f8b7c7cfcd13fb9e4df2a66a3 [file] [log] [blame]
/*
* Copyright 2023 The Hafnium Authors.
*
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/BSD-3-Clause.
*/
#pragma once
#include "hf/ffa.h"
#include "hf/types.h"
/**
* Bits[31:3] of partition properties must be zero for FF-A v1.0.
* This corresponds to table 8.25 "Partition information descriptor"
* in DEN0077A FF-A 1.0 REL specification.
*/
#define FFA_PARTITION_v1_0_RES_MASK (~(UINT32_C(0x7)))
/**
* Create a struct for the "Partition information descriptor" defined for v1.0
* which can be returned to v1.0 endpoints.
* This corresponds to table 8.25 "Partition information descriptor"
* in DEN0077A FF-A 1.0 REL specification.
*/
struct ffa_partition_info_v1_0 {
ffa_id_t vm_id;
ffa_vcpu_count_t vcpu_count;
ffa_partition_properties_t properties;
};
/**
* This corresponds to table 5.16 of the FF-A v1.0 specification,
* "Endpoint memory access descriptor".
*/
struct ffa_memory_access_v1_0 {
struct ffa_memory_region_attributes receiver_permissions;
/**
* Offset in bytes from the start of the outer `ffa_memory_region` to
* an `ffa_composite_memory_region` struct.
*/
uint32_t composite_memory_region_offset;
uint64_t reserved_0;
};
typedef struct {
uint8_t shareability : 2;
uint8_t cacheability : 2;
uint8_t type : 2;
uint8_t security : 2;
} ffa_memory_attributes_v1_0;
ffa_memory_attributes_v1_0 ffa_memory_attributes_truncate(
ffa_memory_attributes_t attrs);
ffa_memory_attributes_t ffa_memory_attributes_extend(
ffa_memory_attributes_v1_0 attrs);
/**
* Information about a set of pages which are being shared. This corresponds to
* table 45 of the FF-A 1.0 EAC specification, "Lend, donate or share memory
* transaction descriptor". Note that it is also used for retrieve requests and
* responses.
*/
struct ffa_memory_region_v1_0 {
/**
* The ID of the VM which originally sent the memory region, i.e. the
* owner.
*/
ffa_id_t sender;
ffa_memory_attributes_v1_0 attributes;
/** Reserved field, must be 0. */
uint8_t reserved_0;
/** Flags to control behaviour of the transaction. */
ffa_memory_region_flags_t flags;
ffa_memory_handle_t handle;
/**
* An implementation defined value associated with the receiver and the
* memory region.
*/
uint64_t tag;
/** Reserved field, must be 0. */
uint32_t reserved_1;
/**
* The number of `ffa_memory_access` entries included in this
* transaction.
*/
uint32_t receiver_count;
/**
* An array of `receiver_count` endpoint memory access descriptors.
* Each one specifies a memory region offset, an endpoint and the
* attributes with which this memory region should be mapped in that
* endpoint's page table.
*/
struct ffa_memory_access_v1_0 receivers[];
};
/**
* Gets the `ffa_composite_memory_region` for the given receiver from an
* `ffa_memory_region`, or NULL if it is not valid.
*/
static inline struct ffa_composite_memory_region *
ffa_memory_region_get_composite_v1_0(
struct ffa_memory_region_v1_0 *memory_region, uint32_t receiver_index)
{
uint32_t offset = memory_region->receivers[receiver_index]
.composite_memory_region_offset;
if (offset == 0) {
return NULL;
}
return (struct ffa_composite_memory_region *)((uint8_t *)memory_region +
offset);
}
void ffa_memory_region_init_header_v1_0(
struct ffa_memory_region_v1_0 *memory_region, ffa_id_t sender,
ffa_memory_attributes_t attributes, ffa_memory_region_flags_t flags,
ffa_memory_handle_t handle, uint32_t tag, uint32_t receiver_count);
void ffa_memory_access_init_v1_0(struct ffa_memory_access_v1_0 *receiver,
ffa_id_t receiver_id,
enum ffa_data_access data_access,
enum ffa_instruction_access instruction_access,
ffa_memory_receiver_flags_t flags);
uint32_t ffa_memory_region_init_v1_0(
struct ffa_memory_region_v1_0 *memory_region,
size_t memory_region_max_size, ffa_id_t sender,
struct ffa_memory_access_v1_0 receivers[], uint32_t receiver_count,
const struct ffa_memory_region_constituent constituents[],
uint32_t constituent_count, uint32_t tag,
ffa_memory_region_flags_t flags, enum ffa_memory_type type,
enum ffa_memory_cacheability cacheability,
enum ffa_memory_shareability shareability, uint32_t *total_length,
uint32_t *fragment_length);
uint32_t ffa_memory_retrieve_request_init_v1_0(
struct ffa_memory_region_v1_0 *memory_region,
ffa_memory_handle_t handle, ffa_id_t sender,
struct ffa_memory_access_v1_0 receivers[], uint32_t receiver_count,
uint32_t tag, ffa_memory_region_flags_t flags,
enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
enum ffa_memory_shareability shareability);