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