Merge tag 'efi-2020-01-rc2' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / include / smem.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * The shared memory system is an allocate-only heap structure that
4  * consists of one of more memory areas that can be accessed by the processors
5  * in the SoC.
6  *
7  * Allocation can be done globally for all processors or to an individual processor.
8  * This is controlled by the @host parameter.
9  *
10  * Allocation and management of heap can be implemented in various ways,
11  * The @item parameter should be used as an index/hash to the memory region.
12  *
13  * Copyright (c) 2018 Ramon Fried <ramon.fried@gmail.com>
14  */
15
16 #ifndef _smemh_
17 #define _smemh_
18
19 /* struct smem_ops: Operations for the SMEM uclass */
20 struct smem_ops {
21         /**
22          * alloc() - allocate space for a smem item
23          *
24          * @host:       remote processor id, or -1 for all processors.
25          * @item:       smem item handle
26          * @size:       number of bytes to be allocated
27          * @return 0 if OK, -ve on error
28          */
29         int (*alloc)(unsigned int host,
30                 unsigned int item, size_t size);
31
32         /**
33          * get() - Resolve ptr of size of a smem item
34          *
35          * @host:       the remote processor, of -1 for all processors.
36          * @item:       smem item handle
37          * @size:       pointer to be filled out with the size of the item
38          * @return      pointer on success, NULL on error
39          */
40         void *(*get)(unsigned int host,
41                 unsigned int item, size_t *size);
42
43         /**
44          * get_free_space() - Get free space in smem in bytes
45          *
46          * @host:   the remote processor identifying a partition, or -1
47          *                      for all processors.
48          * @return      free space, -ve on error
49          */
50         int (*get_free_space)(unsigned int host);
51 };
52
53 #define smem_get_ops(dev)       ((struct smem_ops *)(dev)->driver->ops)
54
55 /**
56  * smem_alloc() - allocate space for a smem item
57  * @host:       remote processor id, or -1
58  * @item:       smem item handle
59  * @size:       number of bytes to be allocated
60  * @return 0 if OK, -ve on error
61  *
62  * Allocate space for a given smem item of size @size, given that the item is
63  * not yet allocated.
64  */
65 int smem_alloc(struct udevice *dev, unsigned int host, unsigned int item, size_t size);
66
67 /**
68  * smem_get() - resolve ptr of size of a smem item
69  * @host:       the remote processor, or -1 for all processors.
70  * @item:       smem item handle
71  * @size:       pointer to be filled out with size of the item
72  * @return      pointer on success, NULL on error
73  *
74  * Looks up smem item and returns pointer to it. Size of smem
75  * item is returned in @size.
76  */
77 void *smem_get(struct udevice *dev, unsigned int host, unsigned int item, size_t *size);
78
79 /**
80  * smem_get_free_space() - retrieve amount of free space in a partition
81  * @host:       the remote processor identifying a partition, or -1
82  *                      for all processors.
83  * @return      size in bytes, -ve on error
84  *
85  * To be used by smem clients as a quick way to determine if any new
86  * allocations has been made.
87  */
88 int smem_get_free_space(struct udevice *dev, unsigned int host);
89
90 #endif /* _smem_h_ */
91