123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020 Marvell International Ltd.
- *
- * Interface to the hardware Free Pool Allocator.
- */
- #ifndef __CVMX_FPA_H__
- #define __CVMX_FPA_H__
- #include "cvmx-scratch.h"
- #include "cvmx-fpa-defs.h"
- #include "cvmx-fpa1.h"
- #include "cvmx-fpa3.h"
- #define CVMX_FPA_MIN_BLOCK_SIZE 128
- #define CVMX_FPA_ALIGNMENT 128
- #define CVMX_FPA_POOL_NAME_LEN 16
- /* On CN78XX in backward-compatible mode, pool is mapped to AURA */
- #define CVMX_FPA_NUM_POOLS \
- (octeon_has_feature(OCTEON_FEATURE_FPA3) ? cvmx_fpa3_num_auras() : CVMX_FPA1_NUM_POOLS)
- /**
- * Structure to store FPA pool configuration parameters.
- */
- struct cvmx_fpa_pool_config {
- s64 pool_num;
- u64 buffer_size;
- u64 buffer_count;
- };
- typedef struct cvmx_fpa_pool_config cvmx_fpa_pool_config_t;
- /**
- * Return the name of the pool
- *
- * @param pool_num Pool to get the name of
- * Return: The name
- */
- const char *cvmx_fpa_get_name(int pool_num);
- /**
- * Initialize FPA per node
- */
- int cvmx_fpa_global_init_node(int node);
- /**
- * Enable the FPA
- */
- static inline void cvmx_fpa_enable(void)
- {
- if (!octeon_has_feature(OCTEON_FEATURE_FPA3))
- cvmx_fpa1_enable();
- else
- cvmx_fpa_global_init_node(cvmx_get_node_num());
- }
- /**
- * Disable the FPA
- */
- static inline void cvmx_fpa_disable(void)
- {
- if (!octeon_has_feature(OCTEON_FEATURE_FPA3))
- cvmx_fpa1_disable();
- /* FPA3 does not have a disable function */
- }
- /**
- * @INTERNAL
- * @deprecated OBSOLETE
- *
- * Kept for transition assistance only
- */
- static inline void cvmx_fpa_global_initialize(void)
- {
- cvmx_fpa_global_init_node(cvmx_get_node_num());
- }
- /**
- * @INTERNAL
- *
- * Convert FPA1 style POOL into FPA3 AURA in
- * backward compatibility mode.
- */
- static inline cvmx_fpa3_gaura_t cvmx_fpa1_pool_to_fpa3_aura(cvmx_fpa1_pool_t pool)
- {
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
- unsigned int node = cvmx_get_node_num();
- cvmx_fpa3_gaura_t aura = __cvmx_fpa3_gaura(node, pool);
- return aura;
- }
- return CVMX_FPA3_INVALID_GAURA;
- }
- /**
- * Get a new block from the FPA
- *
- * @param pool Pool to get the block from
- * Return: Pointer to the block or NULL on failure
- */
- static inline void *cvmx_fpa_alloc(u64 pool)
- {
- /* FPA3 is handled differently */
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
- return cvmx_fpa3_alloc(cvmx_fpa1_pool_to_fpa3_aura(pool));
- } else
- return cvmx_fpa1_alloc(pool);
- }
- /**
- * Asynchronously get a new block from the FPA
- *
- * The result of cvmx_fpa_async_alloc() may be retrieved using
- * cvmx_fpa_async_alloc_finish().
- *
- * @param scr_addr Local scratch address to put response in. This is a byte
- * address but must be 8 byte aligned.
- * @param pool Pool to get the block from
- */
- static inline void cvmx_fpa_async_alloc(u64 scr_addr, u64 pool)
- {
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
- return cvmx_fpa3_async_alloc(scr_addr, cvmx_fpa1_pool_to_fpa3_aura(pool));
- } else
- return cvmx_fpa1_async_alloc(scr_addr, pool);
- }
- /**
- * Retrieve the result of cvmx_fpa_async_alloc
- *
- * @param scr_addr The Local scratch address. Must be the same value
- * passed to cvmx_fpa_async_alloc().
- *
- * @param pool Pool the block came from. Must be the same value
- * passed to cvmx_fpa_async_alloc.
- *
- * Return: Pointer to the block or NULL on failure
- */
- static inline void *cvmx_fpa_async_alloc_finish(u64 scr_addr, u64 pool)
- {
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
- return cvmx_fpa3_async_alloc_finish(scr_addr, cvmx_fpa1_pool_to_fpa3_aura(pool));
- else
- return cvmx_fpa1_async_alloc_finish(scr_addr, pool);
- }
- /**
- * Free a block allocated with a FPA pool.
- * Does NOT provide memory ordering in cases where the memory block was
- * modified by the core.
- *
- * @param ptr Block to free
- * @param pool Pool to put it in
- * @param num_cache_lines
- * Cache lines to invalidate
- */
- static inline void cvmx_fpa_free_nosync(void *ptr, u64 pool, u64 num_cache_lines)
- {
- /* FPA3 is handled differently */
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
- cvmx_fpa3_free_nosync(ptr, cvmx_fpa1_pool_to_fpa3_aura(pool), num_cache_lines);
- else
- cvmx_fpa1_free_nosync(ptr, pool, num_cache_lines);
- }
- /**
- * Free a block allocated with a FPA pool. Provides required memory
- * ordering in cases where memory block was modified by core.
- *
- * @param ptr Block to free
- * @param pool Pool to put it in
- * @param num_cache_lines
- * Cache lines to invalidate
- */
- static inline void cvmx_fpa_free(void *ptr, u64 pool, u64 num_cache_lines)
- {
- if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
- cvmx_fpa3_free(ptr, cvmx_fpa1_pool_to_fpa3_aura(pool), num_cache_lines);
- else
- cvmx_fpa1_free(ptr, pool, num_cache_lines);
- }
- /**
- * Setup a FPA pool to control a new block of memory.
- * This can only be called once per pool. Make sure proper
- * locking enforces this.
- *
- * @param pool Pool to initialize
- * @param name Constant character string to name this pool.
- * String is not copied.
- * @param buffer Pointer to the block of memory to use. This must be
- * accessible by all processors and external hardware.
- * @param block_size Size for each block controlled by the FPA
- * @param num_blocks Number of blocks
- *
- * Return: the pool number on Success,
- * -1 on failure
- */
- int cvmx_fpa_setup_pool(int pool, const char *name, void *buffer, u64 block_size, u64 num_blocks);
- int cvmx_fpa_shutdown_pool(int pool);
- /**
- * Gets the block size of buffer in specified pool
- * @param pool Pool to get the block size from
- * Return: Size of buffer in specified pool
- */
- unsigned int cvmx_fpa_get_block_size(int pool);
- int cvmx_fpa_is_pool_available(int pool_num);
- u64 cvmx_fpa_get_pool_owner(int pool_num);
- int cvmx_fpa_get_max_pools(void);
- int cvmx_fpa_get_current_count(int pool_num);
- int cvmx_fpa_validate_pool(int pool);
- #endif /* __CVM_FPA_H__ */
|