mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
gpu: nvgpu: add doxygen documentation mm.allocator
Add doxygen documentation in allocator.h for mm.allocator. Jira NVGPU-4035 Change-Id: I8c586e6d2da52de1246d5584c65773723203d506 Signed-off-by: Vedashree Vidwans <vvidwans@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/2204125 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Alex Waterman
parent
89cc37305b
commit
425f0871d2
@@ -51,84 +51,222 @@ struct nvgpu_alloc_carveout;
|
||||
struct vm_gk20a;
|
||||
struct gk20a;
|
||||
|
||||
/*
|
||||
* Operations for an allocator to implement.
|
||||
/**
|
||||
* Structure containing operations for an allocator to implement.
|
||||
*/
|
||||
struct nvgpu_allocator_ops {
|
||||
/**
|
||||
* @brief Interface to allocate memory.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] len Size of allocation.
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 (*alloc)(struct nvgpu_allocator *allocator, u64 len);
|
||||
/**
|
||||
* @brief Interface to allocate specific pte size memory.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] len Size of allocation.
|
||||
* @param[in] page_size Page size of resource
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 (*alloc_pte)(struct nvgpu_allocator *allocator, u64 len,
|
||||
u32 page_size);
|
||||
/**
|
||||
* @brief Interface to free given address allocation.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] addr Base address of allocation.
|
||||
*/
|
||||
void (*free_alloc)(struct nvgpu_allocator *allocator, u64 addr);
|
||||
|
||||
/*
|
||||
* Special interface to allocate a memory region with a specific
|
||||
* starting address. Yikes. Note: if free() works for freeing both
|
||||
* regular and fixed allocations then free_fixed() does not need to
|
||||
* be implemented. This behavior exists for legacy reasons and should
|
||||
* not be propagated to new allocators.
|
||||
/**
|
||||
* @brief Interface to allocate a memory region with specific starting
|
||||
* address.
|
||||
*
|
||||
* For allocators where the @page_size field is not applicable it can
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] base Start address of resource.
|
||||
* @param[in] len Size of allocation.
|
||||
* @param[in] page_size Page size of resource.
|
||||
*
|
||||
* For allocators where \a page_size field is not applicable it can
|
||||
* be left as 0. Otherwise a valid page size should be passed (4k or
|
||||
* what the large page size is).
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 (*alloc_fixed)(struct nvgpu_allocator *allocator,
|
||||
u64 base, u64 len, u32 page_size);
|
||||
/**
|
||||
* @brief Free fixed allocation with specific base.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] base Start address of resource.
|
||||
* @param[in] len Size of allocation.
|
||||
*
|
||||
* Note: if free_alloc() works for freeing both regular and fixed
|
||||
* allocations then free_fixed() does not need to be implemented. This
|
||||
* behavior exists for legacy reasons and should not be propagated to
|
||||
* new allocators.
|
||||
*/
|
||||
void (*free_fixed)(struct nvgpu_allocator *allocator,
|
||||
u64 base, u64 len);
|
||||
|
||||
/*
|
||||
* Allow allocators to reserve space for carveouts.
|
||||
/**
|
||||
* @brief Interface to allocate memory carveout.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] co Pointer to carveout structure.
|
||||
*
|
||||
* @return 0 in case of success, < 0 in case of failure.
|
||||
*/
|
||||
int (*reserve_carveout)(struct nvgpu_allocator *allocator,
|
||||
struct nvgpu_alloc_carveout *co);
|
||||
/**
|
||||
* @brief Interface to release memory carveout.
|
||||
*
|
||||
* @param allocator Pointer to nvgpu allocator.
|
||||
* @param co Pointer to carveout structure.
|
||||
*/
|
||||
void (*release_carveout)(struct nvgpu_allocator *allocator,
|
||||
struct nvgpu_alloc_carveout *co);
|
||||
|
||||
/*
|
||||
* Returns info about the allocator.
|
||||
/**
|
||||
* @brief Interface to read base address of allocator.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator start address.
|
||||
*/
|
||||
u64 (*base)(struct nvgpu_allocator *allocator);
|
||||
|
||||
/**
|
||||
* @brief Interface to read length of allocator.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator end address.
|
||||
*/
|
||||
u64 (*length)(struct nvgpu_allocator *allocator);
|
||||
|
||||
/**
|
||||
* @brief Interface to read end address of allocator.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator end address.
|
||||
*/
|
||||
u64 (*end)(struct nvgpu_allocator *allocator);
|
||||
|
||||
/**
|
||||
* @brief Interface to check if allocator is initialized.
|
||||
*
|
||||
* @param allocator Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return True if allocator is initialized, false otherwise.
|
||||
*/
|
||||
bool (*inited)(struct nvgpu_allocator *allocator);
|
||||
|
||||
/**
|
||||
* @brief Interface to read available memory space in allocator.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Available allocator space.
|
||||
*/
|
||||
u64 (*space)(struct nvgpu_allocator *allocator);
|
||||
|
||||
/* Destructor. */
|
||||
/**
|
||||
* @brief Interface to destroy allocator.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
*/
|
||||
void (*fini)(struct nvgpu_allocator *allocator);
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* Debugging. */
|
||||
/**
|
||||
* @brief Interface to print allocator details for debugging.
|
||||
*
|
||||
* @param[in] allocator Pointer to nvgpu allocator.
|
||||
* @param[in] s File pointer. If NULL, details are
|
||||
* printed to kernel log.
|
||||
* @param[in] lock Lock variable.
|
||||
*/
|
||||
void (*print_stats)(struct nvgpu_allocator *allocator,
|
||||
struct seq_file *s, int lock);
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Basic structure to hold details of an allocator.
|
||||
*/
|
||||
struct nvgpu_allocator {
|
||||
/**
|
||||
* Pointer to GPU structure.
|
||||
*/
|
||||
struct gk20a *g;
|
||||
|
||||
/**
|
||||
* Name of allocator.
|
||||
*/
|
||||
char name[32];
|
||||
/**
|
||||
* Synchronization mutex.
|
||||
*/
|
||||
struct nvgpu_mutex lock;
|
||||
|
||||
/**
|
||||
* Generally used to store pointer to specific type of allocator.
|
||||
*/
|
||||
void *priv;
|
||||
/**
|
||||
* Pointer to allocator operations.
|
||||
*/
|
||||
const struct nvgpu_allocator_ops *ops;
|
||||
|
||||
/**
|
||||
* Pointer to debugfs node.
|
||||
*/
|
||||
struct dentry *debugfs_entry;
|
||||
bool debug; /* Control for debug msgs. */
|
||||
/**
|
||||
* Control for debug msgs.
|
||||
*/
|
||||
bool debug;
|
||||
};
|
||||
|
||||
/**
|
||||
* Basic structure to hold details of allocated carveout.
|
||||
*/
|
||||
struct nvgpu_alloc_carveout {
|
||||
/**
|
||||
* Name of allocated carveout.
|
||||
*/
|
||||
const char *name;
|
||||
/**
|
||||
* Base address of carveout.
|
||||
*/
|
||||
u64 base;
|
||||
/**
|
||||
* Length of carveout.
|
||||
*/
|
||||
u64 length;
|
||||
|
||||
/**
|
||||
* Pointer to allocator structure.
|
||||
*/
|
||||
struct nvgpu_allocator *allocator;
|
||||
|
||||
/*
|
||||
* For usage by the allocator implementation.
|
||||
/**
|
||||
* List node for usage by the allocator implementation.
|
||||
*/
|
||||
struct nvgpu_list_node co_entry;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Get address of carveout structure from given nvgpu list node.
|
||||
*
|
||||
* @param[in] node Pointer to nvgpu list node.
|
||||
*
|
||||
* @return allocated carveout structure pointer.
|
||||
*/
|
||||
static inline struct nvgpu_alloc_carveout *
|
||||
nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
{
|
||||
@@ -136,6 +274,13 @@ nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
((uintptr_t)node - offsetof(struct nvgpu_alloc_carveout, co_entry));
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Macro to set carveout attributes.
|
||||
*
|
||||
* @param[in] local_name Name of carveout.
|
||||
* @param[in] local_base Base address of carveout.
|
||||
* @param[in] local_length Length of carveout.
|
||||
*/
|
||||
#define NVGPU_CARVEOUT(local_name, local_base, local_length) \
|
||||
{ \
|
||||
.name = (local_name), \
|
||||
@@ -143,11 +288,7 @@ nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
.length = (local_length) \
|
||||
}
|
||||
|
||||
/*
|
||||
* These are the available allocator flags.
|
||||
*
|
||||
* GPU_ALLOC_GVA_SPACE
|
||||
*
|
||||
/**
|
||||
* This flag makes sense for the buddy allocator only. It specifies that the
|
||||
* allocator will be used for managing a GVA space. When managing GVA spaces
|
||||
* special care has to be taken to ensure that allocations of similar PTE
|
||||
@@ -155,9 +296,10 @@ nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
* code to skip defining both small and large PTE tables for every PDE. That
|
||||
* can save considerable memory for address spaces that have a lot of
|
||||
* allocations.
|
||||
*
|
||||
* GPU_ALLOC_NO_ALLOC_PAGE
|
||||
*
|
||||
*/
|
||||
#define GPU_ALLOC_GVA_SPACE BIT64(0)
|
||||
|
||||
/**
|
||||
* For any allocator that needs to manage a resource in a latency critical
|
||||
* path this flag specifies that the allocator should not use any kmalloc()
|
||||
* or similar functions during normal operation. Initialization routines
|
||||
@@ -170,9 +312,10 @@ nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
* allocations you need to keep track of the meta-data yourself (in this
|
||||
* case the base and length of the allocation as opposed to just the base
|
||||
* of the allocation).
|
||||
*
|
||||
* GPU_ALLOC_4K_VIDMEM_PAGES
|
||||
*
|
||||
*/
|
||||
#define GPU_ALLOC_NO_ALLOC_PAGE BIT64(1)
|
||||
|
||||
/**
|
||||
* We manage vidmem pages at a large page granularity for performance
|
||||
* reasons; however, this can lead to wasting memory. For page allocators
|
||||
* setting this flag will tell the allocator to manage pools of 4K pages
|
||||
@@ -181,26 +324,25 @@ nvgpu_alloc_carveout_from_co_entry(struct nvgpu_list_node *node)
|
||||
* Currently this flag is ignored since the only usage of the page allocator
|
||||
* uses a 4K block size already. However, this flag has been reserved since
|
||||
* it will be necessary in the future.
|
||||
*
|
||||
* GPU_ALLOC_FORCE_CONTIG
|
||||
*
|
||||
*/
|
||||
#define GPU_ALLOC_4K_VIDMEM_PAGES BIT64(2)
|
||||
|
||||
/**
|
||||
* Force allocations to be contiguous. Currently only relevant for page
|
||||
* allocators since all other allocators are naturally contiguous.
|
||||
*
|
||||
* GPU_ALLOC_NO_SCATTER_GATHER
|
||||
*
|
||||
*/
|
||||
#define GPU_ALLOC_FORCE_CONTIG BIT64(3)
|
||||
|
||||
/**
|
||||
* The page allocator normally returns a scatter gather data structure for
|
||||
* allocations (to handle discontiguous pages). However, at times that can
|
||||
* be annoying so this flag forces the page allocator to return a u64
|
||||
* pointing to the allocation base (requires GPU_ALLOC_FORCE_CONTIG to be
|
||||
* set as well).
|
||||
*/
|
||||
#define GPU_ALLOC_GVA_SPACE BIT64(0)
|
||||
#define GPU_ALLOC_NO_ALLOC_PAGE BIT64(1)
|
||||
#define GPU_ALLOC_4K_VIDMEM_PAGES BIT64(2)
|
||||
#define GPU_ALLOC_FORCE_CONTIG BIT64(3)
|
||||
#define GPU_ALLOC_NO_SCATTER_GATHER BIT64(4)
|
||||
|
||||
/** Enumerated type used to identify various allocator types */
|
||||
enum nvgpu_allocator_type {
|
||||
BUDDY_ALLOCATOR = 0,
|
||||
#ifdef CONFIG_NVGPU_DGPU
|
||||
@@ -209,56 +351,106 @@ enum nvgpu_allocator_type {
|
||||
BITMAP_ALLOCATOR
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Acquire mutex associated with allocator.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
static inline void alloc_lock(struct nvgpu_allocator *a)
|
||||
{
|
||||
nvgpu_mutex_acquire(&a->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Release mutex associated with allocator.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
static inline void alloc_unlock(struct nvgpu_allocator *a)
|
||||
{
|
||||
nvgpu_mutex_release(&a->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Buddy allocator specific initializers.
|
||||
/**
|
||||
* @brief Initialize buddy allocator.
|
||||
*
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] na Pointer to allocator structure.
|
||||
* @param[in] vm Pointer to virtual memory.
|
||||
* @param[in] name Name of buddy allocator.
|
||||
* @param[in] base Base address of buddy allocator.
|
||||
* @param[in] size Size of buddy allocator.
|
||||
* @param[in] blk_size Block size of buddy allocator.
|
||||
* @param[in] max_order Maximum allowed buddy order.
|
||||
* @param[in] flags Flags indicating buddy allocator conditions.
|
||||
*
|
||||
* @return 0 in case of success, < 0 otherwise.
|
||||
* @retval -EINVAL in case of incorrect input value.
|
||||
* @retval -ENOMEM in case there is not enough memory for allocation.
|
||||
*/
|
||||
int nvgpu_buddy_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
struct vm_gk20a *vm, const char *name,
|
||||
u64 base, u64 size, u64 blk_size,
|
||||
u64 max_order, u64 flags);
|
||||
|
||||
/*
|
||||
* Bitmap initializers.
|
||||
/**
|
||||
* @brief Initialize bitmap allocator.
|
||||
*
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] na Pointer to allocator structure.
|
||||
* @param[in] name Name of bitmap allocator.
|
||||
* @param[in] base Base address of bitmap allocator.
|
||||
* @param[in] length Size of bitmap allocator.
|
||||
* @param[in] blk_size Block size of bitmap allocator.
|
||||
* @param[in] flags Flags indicating bitmap allocator conditions.
|
||||
*
|
||||
* @return 0 in case of success, < 0 otherwise.
|
||||
* @retval -EINVAL in case of incorrect input value.
|
||||
* @retval -ENOMEM in case there is not enough memory for allocation.
|
||||
*/
|
||||
int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
const char *name, u64 base, u64 length,
|
||||
u64 blk_size, u64 flags);
|
||||
|
||||
#ifdef CONFIG_NVGPU_DGPU
|
||||
/*
|
||||
* Page allocator initializers.
|
||||
|
||||
/**
|
||||
* @brief Initialize page allocator.
|
||||
*
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] na Pointer to allocator structure.
|
||||
* @param[in] name Name of page allocator.
|
||||
* @param[in] base Base address of page allocator.
|
||||
* @param[in] length Size of page allocator.
|
||||
* @param[in] blk_size Block size of page allocator.
|
||||
* @param[in] flags Flags indicating page allocator conditions.
|
||||
*
|
||||
* @return 0 in case of success, < 0 otherwise.
|
||||
* @retval -EINVAL in case of incorrect input value.
|
||||
* @retval -ENOMEM in case there is not enough memory for allocation.
|
||||
*/
|
||||
int nvgpu_page_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
const char *name, u64 base, u64 length,
|
||||
u64 blk_size, u64 flags);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Common init function for any type of allocator.
|
||||
* Returns 0 on success.
|
||||
/**
|
||||
* @brief Common init function for any type of allocator.
|
||||
*
|
||||
* @g: GPU pointer
|
||||
* @na: Pointer to nvgpu_allocator struct
|
||||
* @vm: VM to be associated with an allocator. Can be NULL.
|
||||
* Applicable to buddy allocator only.
|
||||
* @name: Name of the allocator.
|
||||
* @base: Base address of the allocator.
|
||||
* @length: Size of the allocator.
|
||||
* @blk_size: Lowest size of resources that can be allocated.
|
||||
* @max_order: Max order of resource slices that can be allocated.
|
||||
* Applicable to buddy allocator only.
|
||||
* @flags: Additional required flags.
|
||||
* @alloc_type: Allocator type.
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] na Pointer to allocator structure.
|
||||
* @param[in] vm Pointer to virtual memory. Can be NULL.
|
||||
* Applicable to buddy allocator only.
|
||||
* @param[in] name Name of allocator.
|
||||
* @param[in] base Base address of allocator.
|
||||
* @param[in] length Size of allocator.
|
||||
* @param[in] blk_size Lowest size of resources that can be allocated.
|
||||
* @param[in] max_order Max order of resource slices that can be
|
||||
* allocated. Applicable to buddy allocator only.
|
||||
* @param[in] flags Flags indicating additional conditions.
|
||||
* @param[in] alloc_type Allocator type.
|
||||
|
||||
* Returns 0 in case of success, < 0 otherwise.
|
||||
*/
|
||||
int nvgpu_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
struct vm_gk20a *vm, const char *name,
|
||||
@@ -266,47 +458,174 @@ int nvgpu_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
u64 flags, enum nvgpu_allocator_type alloc_type);
|
||||
|
||||
#ifdef CONFIG_NVGPU_FENCE
|
||||
/*
|
||||
* Lockless allocatior initializers.
|
||||
* Note: This allocator can only allocate fixed-size structures of a
|
||||
* pre-defined size.
|
||||
/**
|
||||
* @brief Initialize lockless allocator.
|
||||
*
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] na Pointer to allocator structure.
|
||||
* @param[in] name Name of lockless allocator.
|
||||
* @param[in] base Base address of lockless allocator.
|
||||
* @param[in] length Size of lockless allocator.
|
||||
* @param[in] blk_size Block size of lockless allocator.
|
||||
* @param[in] flags Flags indicating lockless allocator conditions.
|
||||
*
|
||||
* @return 0 in case of success, < 0 otherwise.
|
||||
* @retval -EINVAL in case of incorrect input value.
|
||||
* @retval -ENOMEM in case there is not enough memory for allocation.
|
||||
*/
|
||||
int nvgpu_lockless_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
||||
const char *name, u64 base, u64 length,
|
||||
u64 blk_size, u64 flags);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Largest block of resources that fits in address space.
|
||||
*/
|
||||
#define GPU_BALLOC_MAX_ORDER 63U
|
||||
|
||||
/*
|
||||
* Allocator APIs.
|
||||
/**
|
||||
* @brief Interface to allocate resources.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] len Size of allocation.
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 nvgpu_alloc(struct nvgpu_allocator *a, u64 len);
|
||||
|
||||
/**
|
||||
* @brief Interface to allocate resources with specific pte.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] len Size of allocation.
|
||||
* @param[in] page_size Page size of resource.
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 nvgpu_alloc_pte(struct nvgpu_allocator *a, u64 len, u32 page_size);
|
||||
|
||||
/**
|
||||
* @brief Interface to free allocated resources.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] addr Base address of allocation.
|
||||
*/
|
||||
void nvgpu_free(struct nvgpu_allocator *a, u64 addr);
|
||||
|
||||
/**
|
||||
* @brief Interface to allocate resources with specific start address.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] base Start address of resource.
|
||||
* @param[in] len Size of allocation.
|
||||
* @param[in] page_size Page size of resource.
|
||||
*
|
||||
* @return Address of allocation in case of success, 0 otherwise.
|
||||
*/
|
||||
u64 nvgpu_alloc_fixed(struct nvgpu_allocator *a, u64 base, u64 len,
|
||||
u32 page_size);
|
||||
|
||||
/**
|
||||
* @brief Interface to free resources at specific start address.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] base Start address of resource.
|
||||
* @param[in] len Size of allocation.
|
||||
*/
|
||||
void nvgpu_free_fixed(struct nvgpu_allocator *a, u64 base, u64 len);
|
||||
|
||||
/**
|
||||
* @brief Interface to reserve carveout.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] co Pointer to carveout structure.
|
||||
*
|
||||
* @return 0 in case of success, < 0 in case of failure.
|
||||
*/
|
||||
int nvgpu_alloc_reserve_carveout(struct nvgpu_allocator *a,
|
||||
struct nvgpu_alloc_carveout *co);
|
||||
|
||||
/**
|
||||
* @brief Interface to release carveout.
|
||||
*
|
||||
* @param a Pointer to nvgpu allocator.
|
||||
* @param co Pointer to carveout structure.
|
||||
*/
|
||||
void nvgpu_alloc_release_carveout(struct nvgpu_allocator *a,
|
||||
struct nvgpu_alloc_carveout *co);
|
||||
|
||||
/**
|
||||
* @brief Interface to read allocator base.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator start address.
|
||||
*/
|
||||
u64 nvgpu_alloc_base(struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Interface to read allocator length.
|
||||
*
|
||||
* @param a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator length address.
|
||||
*/
|
||||
u64 nvgpu_alloc_length(struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Interface to read allocator end address.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Allocator end address.
|
||||
*/
|
||||
u64 nvgpu_alloc_end(struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Interface to check if allocator is initialized.
|
||||
*
|
||||
* @param a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return True if allocator is initialized, false otherwise.
|
||||
*/
|
||||
bool nvgpu_alloc_initialized(struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Interface to get allocator space.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return Available allocator space.
|
||||
*/
|
||||
u64 nvgpu_alloc_space(struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Interface to destroy allocator.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
void nvgpu_alloc_destroy(struct nvgpu_allocator *a);
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/**
|
||||
* @brief Interface to print allocator details.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] s File pointer.
|
||||
* If NULL, details are printed to kernel log.
|
||||
* @param[in] lock Lock variable.
|
||||
*/
|
||||
void nvgpu_alloc_print_stats(struct nvgpu_allocator *a,
|
||||
struct seq_file *s, int lock);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get GPU pointer from allocator pointer.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*
|
||||
* @return GPU pointer.
|
||||
*/
|
||||
static inline struct gk20a *nvgpu_alloc_to_gpu(struct nvgpu_allocator *a)
|
||||
{
|
||||
return a->g;
|
||||
@@ -316,19 +635,53 @@ static inline struct gk20a *nvgpu_alloc_to_gpu(struct nvgpu_allocator *a)
|
||||
/*
|
||||
* Common functionality for the internals of the allocators.
|
||||
*/
|
||||
/**
|
||||
* @brief Initialize debug allocator file.
|
||||
*
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
void nvgpu_init_alloc_debug(struct gk20a *g, struct nvgpu_allocator *a);
|
||||
|
||||
/**
|
||||
* @brief Destroy debug allocator file.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
void nvgpu_fini_alloc_debug(struct nvgpu_allocator *a);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Initialize nvgpu allocator.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
* @param[in] g Pointer to GPU structure.
|
||||
* @param[in] name Name of allocator.
|
||||
* @param[in] priv Pointer to private data.
|
||||
* @param[in] dbg Debug flag.
|
||||
* @param[in] ops Pointer to allocator operations.
|
||||
*
|
||||
* @return 0 in case of success, < 0 in case of failure.
|
||||
*/
|
||||
int nvgpu_alloc_common_init(struct nvgpu_allocator *a, struct gk20a *g,
|
||||
const char *name, void *priv, bool dbg,
|
||||
const struct nvgpu_allocator_ops *ops);
|
||||
|
||||
/**
|
||||
* @brief Enable allocator debug.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
static inline void nvgpu_alloc_enable_dbg(struct nvgpu_allocator *a)
|
||||
{
|
||||
a->debug = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Disable allocator debug.
|
||||
*
|
||||
* @param[in] a Pointer to nvgpu allocator.
|
||||
*/
|
||||
static inline void nvgpu_alloc_disable_dbg(struct nvgpu_allocator *a)
|
||||
{
|
||||
a->debug = false;
|
||||
|
||||
Reference in New Issue
Block a user