shmem.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. */
  6. /*
  7. * @file generic/shmem.c
  8. * @brief Generic libmetal shared memory handling.
  9. */
  10. #include <metal/errno.h>
  11. #include <metal/assert.h>
  12. #include <metal/shmem.h>
  13. #include <metal/sys.h>
  14. #include <metal/utilities.h>
  15. int metal_shmem_register_generic(struct metal_generic_shmem *shmem)
  16. {
  17. /* Make sure that we can be found. */
  18. metal_assert(shmem->name && strlen(shmem->name) != 0);
  19. /* Statically registered shmem regions cannot have a destructor. */
  20. metal_assert(!shmem->io.ops.close);
  21. metal_list_add_tail(&_metal.common.generic_shmem_list,
  22. &shmem->node);
  23. return 0;
  24. }
  25. int metal_shmem_open_generic(const char *name, size_t size,
  26. struct metal_io_region **result)
  27. {
  28. struct metal_generic_shmem *shmem;
  29. struct metal_list *node;
  30. metal_list_for_each(&_metal.common.generic_shmem_list, node) {
  31. shmem = metal_container_of(node, struct metal_generic_shmem, node);
  32. if (strcmp(shmem->name, name) != 0)
  33. continue;
  34. if (size > metal_io_region_size(&shmem->io))
  35. continue;
  36. *result = &shmem->io;
  37. return 0;
  38. }
  39. return -ENOENT;
  40. }