1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. 4 */ 5 6 #ifndef BUFFER_H 7 #define BUFFER_H 8 9 #include <assert.h> 10 #include <smc-rmi.h> 11 #include <stdbool.h> 12 #include <utils_def.h> 13 14 enum buffer_slot { 15 /* 16 * NS. 17 */ 18 SLOT_NS, 19 20 /* 21 * RMM-private. 22 */ 23 SLOT_DELEGATED, 24 SLOT_RD, 25 SLOT_REC, 26 SLOT_REC2, /* Some commands access two REC granules at a time*/ 27 SLOT_REC_TARGET, /* Target REC for interrupts */ 28 SLOT_REC_AUX0, /* Reserve slots for max rec auxiliary granules 29 * so that all of them can be mapped at once. 30 * If the max aux granules is 0, no slots will 31 * be reserved. 32 */ 33 SLOT_RTT = SLOT_REC_AUX0 + MAX_REC_AUX_GRANULES, 34 SLOT_RTT2, /* Some commands access two RTT granules at a time*/ 35 SLOT_RSI_CALL, 36 NR_CPU_SLOTS 37 }; 38 39 struct granule; 40 41 void assert_cpu_slots_empty(void); 42 void *granule_map(struct granule *g, enum buffer_slot slot); 43 void buffer_unmap(void *buf); 44 45 bool ns_buffer_read(enum buffer_slot slot, 46 struct granule *granule, 47 unsigned int offset, 48 unsigned int size, 49 void *dest); 50 bool ns_buffer_write(enum buffer_slot slot, 51 struct granule *granule, 52 unsigned int offset, 53 unsigned int size, 54 void *src); 55 56 /* 57 * Initializes and enables the VMSA for the slot buffer mechanism. 58 * 59 * Create an empty translation context for the current CPU. 60 * If the context already exists (e.g. current CPU was previously 61 * turned on and therefore the context is already in memory), 62 * nothing happens. 63 */ 64 void slot_buf_setup_xlat(void); 65 66 /* 67 * Finishes initializing the slot buffer mechanism. 68 * This function should be called after the MMU is enabled. 69 */ 70 void slot_buf_init(void); 71 72 /****************************************************************************** 73 * Internal APIs not meant to be invoked by generic RMM code. 74 * These are exposed to facilitate testing. 75 *****************************************************************************/ 76 77 /* 78 * Maps a given PA into the specified slot. This API verifies that the slot 79 * matches the 'ns' argument. 80 * 81 * On success, it returns the VA of the slot where the PA has been mapped to. 82 * Otherwise, it will return NULL. 83 */ 84 void *buffer_map_internal(enum buffer_slot slot, unsigned long addr, bool ns); 85 86 /* 87 * Unmaps the slot buffer corresponding to the VA passed via `buf` argument. 88 */ 89 void buffer_unmap_internal(void *buf); 90 91 #endif /* BUFFER_H */ 92