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 generic/shmem.c
9 * @brief Generic libmetal shared memory handling.
10 */
11
12 #include <metal/errno.h>
13 #include <metal/assert.h>
14 #include <metal/shmem.h>
15 #include <metal/sys.h>
16 #include <metal/utilities.h>
17
metal_shmem_register_generic(struct metal_generic_shmem * shmem)18 int metal_shmem_register_generic(struct metal_generic_shmem *shmem)
19 {
20 /* Make sure that we can be found. */
21 metal_assert(shmem->name && strlen(shmem->name) != 0);
22
23 /* Statically registered shmem regions cannot have a destructor. */
24 metal_assert(!shmem->io.ops.close);
25
26 metal_list_add_tail(&_metal.common.generic_shmem_list,
27 &shmem->node);
28 return 0;
29 }
30
metal_shmem_open_generic(const char * name,size_t size,struct metal_io_region ** result)31 int metal_shmem_open_generic(const char *name, size_t size,
32 struct metal_io_region **result)
33 {
34 struct metal_generic_shmem *shmem;
35 struct metal_list *node;
36
37 metal_list_for_each(&_metal.common.generic_shmem_list, node) {
38 shmem = metal_container_of(node, struct metal_generic_shmem, node);
39 if (strcmp(shmem->name, name) != 0)
40 continue;
41 if (size > metal_io_region_size(&shmem->io))
42 continue;
43 *result = &shmem->io;
44 return 0;
45 }
46
47 return -ENOENT;
48 }
49