This is a uclass for Shared memory manager drivers. A Shared Memory Manager driver implements an interface for allocating and accessing items in the memory area shared among all of the processors. Signed-off-by: Ramon Fried <ramon.fried@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>lime2-spi
parent
b19886b946
commit
7b384eccc7
@ -0,0 +1,2 @@ |
||||
menuconfig SMEM |
||||
bool "SMEM (Shared Memory mamanger) support" |
@ -0,0 +1,5 @@ |
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Makefile for the U-Boot SMEM interface drivers
|
||||
|
||||
obj-$(CONFIG_SMEM) += smem-uclass.o
|
@ -0,0 +1,45 @@ |
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (c) 2018 Ramon Fried <ramon.fried@gmail.com> |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <smem.h> |
||||
|
||||
int smem_alloc(struct udevice *dev, unsigned int host, |
||||
unsigned int item, size_t size) |
||||
{ |
||||
struct smem_ops *ops = smem_get_ops(dev); |
||||
|
||||
if (!ops->alloc) |
||||
return -ENOSYS; |
||||
|
||||
return ops->alloc(host, item, size); |
||||
} |
||||
|
||||
void *smem_get(struct udevice *dev, unsigned int host, |
||||
unsigned int item, size_t *size) |
||||
{ |
||||
struct smem_ops *ops = smem_get_ops(dev); |
||||
|
||||
if (!ops->get) |
||||
return NULL; |
||||
|
||||
return ops->get(host, item, size); |
||||
} |
||||
|
||||
int smem_get_free_space(struct udevice *dev, unsigned int host) |
||||
{ |
||||
struct smem_ops *ops = smem_get_ops(dev); |
||||
|
||||
if (!ops->get_free_space) |
||||
return -ENOSYS; |
||||
|
||||
return ops->get_free_space(host); |
||||
} |
||||
|
||||
UCLASS_DRIVER(smem) = { |
||||
.id = UCLASS_SMEM, |
||||
.name = "smem", |
||||
}; |
@ -0,0 +1,91 @@ |
||||
/* 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_ */ |
||||
|
Loading…
Reference in new issue