blob: 95a82c83713ac3ec1fb30d5bb806e6d1e4296bae [file] [log] [blame]
/*
* Copyright 2024 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/vm.h"
struct ffa_value ffa_notifications_is_bitmap_access_valid(struct vcpu *current,
ffa_id_t vm_id);
bool ffa_notifications_is_bind_valid(struct vcpu *current, ffa_id_t sender_id,
ffa_id_t receiver_id);
bool ffa_notifications_update_bindings_forward(
ffa_id_t receiver_id, ffa_id_t sender_id,
ffa_notification_flags_t flags, ffa_notifications_bitmap_t bitmap,
bool is_bind, struct ffa_value *ret);
bool ffa_notifications_is_set_valid(struct vcpu *current, ffa_id_t sender_id,
ffa_id_t receiver_id);
bool ffa_notifications_set_forward(ffa_id_t sender_vm_id,
ffa_id_t receiver_vm_id,
ffa_notification_flags_t flags,
ffa_notifications_bitmap_t bitmap,
struct ffa_value *ret);
bool ffa_notifications_is_get_valid(struct vcpu *current, ffa_id_t receiver_id,
ffa_notification_flags_t flags);
struct ffa_value ffa_notifications_get_from_sp(
struct vm_locked receiver_locked, ffa_vcpu_index_t vcpu_id,
ffa_notifications_bitmap_t *from_sp);
struct ffa_value ffa_notifications_get_framework_notifications(
struct vm_locked receiver_locked, ffa_notifications_bitmap_t *from_fwk,
ffa_notification_flags_t flags, ffa_vcpu_index_t vcpu_id);
/**
* Creates a bitmap for the VM of the given ID.
*/
struct ffa_value ffa_notifications_bitmap_create(ffa_id_t vm_id,
ffa_vcpu_count_t vcpu_count);
/**
* Issues a FFA_NOTIFICATION_BITMAP_CREATE.
* Returns true if the call goes well, and false if call returns with
* FFA_ERROR_32.
*/
bool ffa_notifications_bitmap_create_call(ffa_id_t vm_id,
ffa_vcpu_count_t vcpu_count);
/**
* Destroys the notifications bitmap for the given VM ID.
*/
struct ffa_value ffa_notifications_bitmap_destroy(ffa_id_t vm_id);
/**
* Helper to send SRI and safely update `ffa_sri_state`, if there has been
* a call to FFA_NOTIFICATION_SET, and the SRI has been delayed.
* To be called at a context switch to the NWd.
*/
void ffa_notifications_sri_trigger_if_delayed(struct cpu *cpu);
/**
* Helper to send SRI and safely update `ffa_sri_state`, if it hasn't been
* delayed in call to FFA_NOTIFICATION_SET.
*/
void ffa_notifications_sri_trigger_not_delayed(struct cpu *cpu);
/**
* Track that in current CPU there was a notification set with delay SRI flag.
*/
void ffa_notifications_sri_set_delayed(struct cpu *cpu);
/**
* Initialize Schedule Receiver Interrupts needed in the context of
* notifications support.
*/
void ffa_notifications_sri_init(struct cpu *cpu);
void ffa_notifications_info_get_forward(uint16_t *ids, uint32_t *ids_count,
uint32_t *lists_sizes,
uint32_t *lists_count,
uint32_t ids_count_max);