92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ */
 | |
| /*
 | |
|  * The shared memory system is an allocate-only heap structure that
 | |
|  * consists of one of more memory areas that can be accessed by the processors
 | |
|  * in the SoC.
 | |
|  *
 | |
|  * Allocation can be done globally for all processors or to an individual processor.
 | |
|  * This is controlled by the @host parameter.
 | |
|  *
 | |
|  * Allocation and management of heap can be implemented in various ways,
 | |
|  * The @item parameter should be used as an index/hash to the memory region.
 | |
|  *
 | |
|  * Copyright (c) 2018 Ramon Fried <ramon.fried@gmail.com>
 | |
|  */
 | |
| 
 | |
| #ifndef _smemh_
 | |
| #define _smemh_
 | |
| 
 | |
| /* struct smem_ops: Operations for the SMEM uclass */
 | |
| struct smem_ops {
 | |
| 	/**
 | |
| 	 * alloc() - allocate space for a smem item
 | |
| 	 *
 | |
| 	 * @host:	remote processor id, or -1 for all processors.
 | |
| 	 * @item:	smem item handle
 | |
| 	 * @size:	number of bytes to be allocated
 | |
| 	 * @return 0 if OK, -ve on error
 | |
| 	 */
 | |
| 	int (*alloc)(unsigned int host,
 | |
| 		unsigned int item, size_t size);
 | |
| 
 | |
| 	/**
 | |
| 	 * get() - Resolve ptr of size of a smem item
 | |
| 	 *
 | |
| 	 * @host:	the remote processor, of -1 for all processors.
 | |
| 	 * @item:	smem item handle
 | |
| 	 * @size:	pointer to be filled out with the size of the item
 | |
| 	 * @return	pointer on success, NULL on error
 | |
| 	 */
 | |
| 	void *(*get)(unsigned int host,
 | |
| 		unsigned int item, size_t *size);
 | |
| 
 | |
| 	/**
 | |
| 	 * get_free_space() - Get free space in smem in bytes
 | |
| 	 *
 | |
| 	 * @host:   the remote processor identifying a partition, or -1
 | |
| 	 *			for all processors.
 | |
| 	 * @return	free space, -ve on error
 | |
| 	 */
 | |
| 	int (*get_free_space)(unsigned int host);
 | |
| };
 | |
| 
 | |
| #define smem_get_ops(dev)	((struct smem_ops *)(dev)->driver->ops)
 | |
| 
 | |
| /**
 | |
|  * smem_alloc() - allocate space for a smem item
 | |
|  * @host:	remote processor id, or -1
 | |
|  * @item:	smem item handle
 | |
|  * @size:	number of bytes to be allocated
 | |
|  * @return 0 if OK, -ve on error
 | |
|  *
 | |
|  * Allocate space for a given smem item of size @size, given that the item is
 | |
|  * not yet allocated.
 | |
|  */
 | |
| int smem_alloc(struct udevice *dev, unsigned int host, unsigned int item, size_t size);
 | |
| 
 | |
| /**
 | |
|  * smem_get() - resolve ptr of size of a smem item
 | |
|  * @host:	the remote processor, or -1 for all processors.
 | |
|  * @item:	smem item handle
 | |
|  * @size:	pointer to be filled out with size of the item
 | |
|  * @return	pointer on success, NULL on error
 | |
|  *
 | |
|  * Looks up smem item and returns pointer to it. Size of smem
 | |
|  * item is returned in @size.
 | |
|  */
 | |
| void *smem_get(struct udevice *dev, unsigned int host, unsigned int item, size_t *size);
 | |
| 
 | |
| /**
 | |
|  * smem_get_free_space() - retrieve amount of free space in a partition
 | |
|  * @host:	the remote processor identifying a partition, or -1
 | |
|  *			for all processors.
 | |
|  * @return	size in bytes, -ve on error
 | |
|  *
 | |
|  * To be used by smem clients as a quick way to determine if any new
 | |
|  * allocations has been made.
 | |
|  */
 | |
| int smem_get_free_space(struct udevice *dev, unsigned int host);
 | |
| 
 | |
| #endif /* _smem_h_ */
 | |
| 
 | 
