1 /*
2  * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /*
8  * @file	shmem.h
9  * @brief	Shared memory primitives for libmetal.
10  */
11 
12 #ifndef __METAL_SHMEM__H__
13 #define __METAL_SHMEM__H__
14 
15 #include <metal/io.h>
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 /** \defgroup shmem Shared Memory Interfaces
22  *  @{ */
23 
24 /** Generic shared memory data structure. */
25 struct metal_generic_shmem {
26 	const char		*name;
27 	struct metal_io_region	io;
28 	struct metal_list	node;
29 };
30 
31 /**
32  * @brief	Open a libmetal shared memory segment.
33  *
34  * Open a shared memory segment.
35  *
36  * @param[in]		name	Name of segment to open.
37  * @param[in]		size	Size of segment.
38  * @param[out]		io	I/O region handle, if successful.
39  * @return	0 on success, or -errno on failure.
40  *
41  * @see metal_shmem_create
42  */
43 extern int metal_shmem_open(const char *name, size_t size,
44 			    struct metal_io_region **io);
45 
46 /**
47  * @brief	Statically register a generic shared memory region.
48  *
49  * Shared memory regions may be statically registered at application
50  * initialization, or may be dynamically opened.  This interface is used for
51  * static registration of regions.  Subsequent calls to metal_shmem_open() look
52  * up in this list of pre-registered regions.
53  *
54  * @param[in]	shmem	Generic shmem structure.
55  * @return 0 on success, or -errno on failure.
56  */
57 extern int metal_shmem_register_generic(struct metal_generic_shmem *shmem);
58 
59 #ifdef METAL_INTERNAL
60 
61 /**
62  * @brief	Open a statically registered shmem segment.
63  *
64  * This interface is meant for internal libmetal use within system specific
65  * shmem implementations.
66  *
67  * @param[in]		name	Name of segment to open.
68  * @param[in]		size	Size of segment.
69  * @param[out]		io	I/O region handle, if successful.
70  * @return	0 on success, or -errno on failure.
71  */
72 int metal_shmem_open_generic(const char *name, size_t size,
73 			     struct metal_io_region **result);
74 
75 #endif
76 
77 /** @} */
78 
79 #ifdef __cplusplus
80 }
81 #endif
82 
83 #endif /* __METAL_SHMEM__H__ */
84