For some use cases, it is not known beforehand, how much removed (carve-out) region size must be reserved. Hence the reserved region size might need to be adjusted to support varying use cases. In such cases maintaining different device tree configurations to support varying carve-out region size is difficult. Introduce an optional device tree property, to reserved-memory, "no-map-fixup" which works in tandem with "removed-dma-pool" compatibility that tries to shrink and adjust the removed area on very first successful allocation. At end of which it returns the additional (unused) pages from the region back to the system. Point to note is this that this adjustment is done on very first allocation and thereafter the region size is big enough only to support maximum of first allocation request size. This fixup is attempted only once upon first allocation and never after that. Clients can allocate and free from this region as any other dma region. As the description suggests this type of region is specific to certain special needs and is not to be used for common use cases. Change-Id: I31f49d6bd957814bc2ef3a94910425b820ccc739 Signed-off-by: Shiraz Hashim <shashim@codeaurora.org>
50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
#ifndef __OF_RESERVED_MEM_H
|
|
#define __OF_RESERVED_MEM_H
|
|
|
|
struct device;
|
|
struct of_phandle_args;
|
|
struct reserved_mem_ops;
|
|
|
|
struct reserved_mem {
|
|
const char *name;
|
|
unsigned long fdt_node;
|
|
unsigned long phandle;
|
|
const struct reserved_mem_ops *ops;
|
|
phys_addr_t base;
|
|
phys_addr_t size;
|
|
void *priv;
|
|
int fixup;
|
|
};
|
|
|
|
struct reserved_mem_ops {
|
|
int (*device_init)(struct reserved_mem *rmem,
|
|
struct device *dev);
|
|
void (*device_release)(struct reserved_mem *rmem,
|
|
struct device *dev);
|
|
};
|
|
|
|
typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem);
|
|
|
|
#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
|
|
_OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
|
|
|
|
#ifdef CONFIG_OF_RESERVED_MEM
|
|
int of_reserved_mem_device_init(struct device *dev);
|
|
void of_reserved_mem_device_release(struct device *dev);
|
|
|
|
void fdt_init_reserved_mem(void);
|
|
void fdt_reserved_mem_save_node(unsigned long node, const char *uname,
|
|
phys_addr_t base, phys_addr_t size);
|
|
#else
|
|
static inline int of_reserved_mem_device_init(struct device *dev)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline void of_reserved_mem_device_release(struct device *pdev) { }
|
|
|
|
static inline void fdt_init_reserved_mem(void) { }
|
|
static inline void fdt_reserved_mem_save_node(unsigned long node,
|
|
const char *uname, phys_addr_t base, phys_addr_t size) { }
|
|
#endif
|
|
|
|
#endif /* __OF_RESERVED_MEM_H */
|