blob: 1dcb0501d3074e463fea8f158404517557f906ab [file] [log] [blame]
Daniel Boulbyb2fb80e2021-02-03 15:09:23 +00001/*
2 * Copyright 2021 The Hafnium Authors.
3 *
4 * Use of this source code is governed by a BSD-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/BSD-3-Clause.
7 */
8
9#pragma once
10
11#include "hf/ffa.h"
Olivier Deprez55a189e2021-06-09 15:45:27 +020012#include "hf/vcpu.h"
J-Alvesc003a7a2021-03-18 13:06:53 +000013#include "hf/vm.h"
Daniel Boulbyb2fb80e2021-02-03 15:09:23 +000014
Daniel Boulby87b2dc82021-08-04 14:07:43 +010015/** Returns information on features that are specific to the platform. */
16struct ffa_value plat_ffa_features(uint32_t function_id);
Daniel Boulbyb2fb80e2021-02-03 15:09:23 +000017/** Returns the SPMC ID. */
18struct ffa_value plat_ffa_spmc_id_get(void);
Olivier Deprez55a189e2021-06-09 15:45:27 +020019
20void plat_ffa_log_init(void);
21void plat_ffa_init(bool tee_enabled);
22bool plat_ffa_is_direct_request_valid(struct vcpu *current,
23 ffa_vm_id_t sender_vm_id,
24 ffa_vm_id_t receiver_vm_id);
25bool plat_ffa_is_direct_response_valid(struct vcpu *current,
26 ffa_vm_id_t sender_vm_id,
27 ffa_vm_id_t receiver_vm_id);
28bool plat_ffa_direct_request_forward(ffa_vm_id_t receiver_vm_id,
29 struct ffa_value args,
30 struct ffa_value *ret);
J-Alvesa0f317d2021-06-09 13:31:59 +010031bool plat_ffa_is_notifications_create_valid(struct vcpu *current,
32 ffa_vm_id_t vm_id);
J-Alvesc003a7a2021-03-18 13:06:53 +000033
34bool plat_ffa_is_notifications_bind_valid(struct vcpu *current,
35 ffa_vm_id_t sender_id,
36 ffa_vm_id_t receiver_id);
J-Alvesb15e9402021-09-08 11:44:42 +010037bool plat_ffa_notifications_update_bindings_forward(
38 ffa_vm_id_t receiver_id, ffa_vm_id_t sender_id, uint32_t flags,
39 ffa_notifications_bitmap_t bitmap, bool is_bind, struct ffa_value *ret);
J-Alvesc003a7a2021-03-18 13:06:53 +000040
J-Alvesaa79c012021-07-09 14:29:45 +010041bool plat_ffa_is_notification_set_valid(struct vcpu *current,
42 ffa_vm_id_t sender_id,
43 ffa_vm_id_t receiver_id);
44
J-Alvesde7bd2f2021-09-09 19:54:35 +010045bool plat_ffa_notification_set_forward(ffa_vm_id_t sender_vm_id,
46 ffa_vm_id_t receiver_vm_id,
47 uint32_t flags,
48 ffa_notifications_bitmap_t bitmap,
49 struct ffa_value *ret);
50
J-Alvesaa79c012021-07-09 14:29:45 +010051bool plat_ffa_is_notification_get_valid(struct vcpu *current,
52 ffa_vm_id_t receiver_id);
53
J-Alves98ff9562021-09-09 14:39:41 +010054bool plat_ffa_notifications_get_from_sp(struct vm_locked receiver_locked,
55 ffa_vcpu_index_t vcpu_id,
56 ffa_notifications_bitmap_t *from_sp,
57 struct ffa_value *ret);
58
J-Alvesaa79c012021-07-09 14:29:45 +010059bool plat_ffa_notifications_get_call(ffa_vm_id_t receiver_id, uint32_t vcpu_id,
60 uint32_t flags, struct ffa_value *ret);
61
Olivier Deprez55a189e2021-06-09 15:45:27 +020062/**
Maksims Svecovs9ddf86a2021-05-06 17:17:21 +010063 * Checks whether managed exit is supported by given SP.
64 */
65bool plat_ffa_vm_managed_exit_supported(struct vm *vm);
66
67/**
Olivier Deprez55a189e2021-06-09 15:45:27 +020068 * Encodes memory handle according to section 5.10.2 of the FF-A v1.0 spec.
69 */
70ffa_memory_handle_t plat_ffa_memory_handle_make(uint64_t index);
71
72/**
73 * Checks whether given handle was allocated by current world, according to
74 * handle encoding rules.
75 */
76bool plat_ffa_memory_handle_allocated_by_current_world(
77 ffa_memory_handle_t handle);
Maksims Svecovsb596eab2021-04-27 00:52:27 +010078
79/**
80 * Return the FF-A partition info VM/SP properties given the VM id.
81 */
82ffa_partition_properties_t plat_ffa_partition_properties(
83 ffa_vm_id_t current_id, const struct vm *target);
J-Alves4ef6e842021-03-18 12:47:01 +000084
85/**
86 * Initializes the NWd VM structures for Notifications support.
87 */
88void plat_ffa_vm_init(void);
J-Alvesa0f317d2021-06-09 13:31:59 +010089
90/**
91 * Get NWd VM's structure.
92 */
93struct vm_locked plat_ffa_vm_find_locked(ffa_vm_id_t vm_id);
94
95/**
96 * Creates a bitmap for the VM of the given ID.
97 */
98struct ffa_value plat_ffa_notifications_bitmap_create(
99 ffa_vm_id_t vm_id, ffa_vcpu_count_t vcpu_count);
100
101/**
J-Alvesa9c7cba2021-08-25 16:26:11 +0100102 * Issues a FFA_NOTIFICATION_BITMAP_CREATE.
103 */
104bool plat_ffa_notifications_bitmap_create_call(ffa_vm_id_t vm_id,
105 ffa_vcpu_count_t vcpu_count,
106 struct ffa_value *ret);
107
108/**
J-Alvesa0f317d2021-06-09 13:31:59 +0100109 * Destroys the notifications bitmap for the given VM ID.
110 */
111struct ffa_value plat_ffa_notifications_bitmap_destroy(ffa_vm_id_t vm_id);
J-Alvesc003a7a2021-03-18 13:06:53 +0000112
113/**
114 * Helper to get the struct notifications, depending on the sender's id.
115 */
116struct notifications *plat_ffa_vm_get_notifications_senders_world(
117 struct vm_locked vm_locked, ffa_vm_id_t sender_id);
118
119/**
120 * Helper to check if FF-A ID is a VM ID.
121 */
122bool plat_ffa_is_vm_id(ffa_vm_id_t vm_id);
Raghu Krishnamurthy62f97a72021-07-27 02:14:59 -0700123
124/**
125 * Forward normal world calls of FFA_RUN ABI to other world.
126 */
127bool plat_ffa_run_forward(ffa_vm_id_t vm_id, ffa_vcpu_index_t vcpu_idx,
128 struct ffa_value *ret);
J-Alvesc8e8a222021-06-08 17:33:52 +0100129
130bool plat_ffa_notification_info_get_call(struct ffa_value *ret);
131
132bool plat_ffa_vm_notifications_info_get(uint16_t *ids, uint32_t *ids_count,
133 uint32_t *lists_sizes,
134 uint32_t *lists_count,
135 const uint32_t ids_count_max);