/* SPDX-License-Identifier: GPL-2.0+ */ /* * Xtensa buffer pool API header * * Copyright 2018 NXP * Copyright (c) 2012-2013 by Tensilica Inc */ #ifndef FSL_DSP_POOL_H #define FSL_DSP_POOL_H #include #include "fsl_dsp_proxy.h" /* ...buffer pool type */ typedef u32 xf_pool_type_t; /* ...previous declaration of struct */ struct xf_buffer; struct xf_pool; struct xf_handle; struct xf_message; struct xf_client; /* ...response callback */ typedef void (*xf_response_cb)(struct xf_handle *h, struct xf_message *msg); /* ...buffer pool type */ enum xf_pool_type { XF_POOL_AUX = 0, XF_POOL_INPUT = 1, XF_POOL_OUTPUT = 2 }; /* ...buffer link pointer */ union xf_buffer_link { /* ...pointer to next free buffer in a pool (for free buffer) */ struct xf_buffer *next; /* ...reference to a buffer pool (for allocated buffer) */ struct xf_pool *pool; }; /* ...buffer descriptor */ struct xf_buffer { /* ...virtual address of contiguous buffer */ void *address; /* ...link pointer */ union xf_buffer_link link; }; /* ...buffer pool */ struct xf_pool { /* ...reference to proxy data */ struct xf_proxy *proxy; /* ...length of individual buffer in a pool */ u32 length; /* ...number of buffers in a pool */ u32 number; /* ...pointer to pool memory */ void *p; /* ...pointer to first free buffer in a pool */ struct xf_buffer *free; /* ...individual buffers */ struct xf_buffer buffer[0]; }; /* component handle */ struct xf_handle { /* ...reference to proxy data */ struct xf_proxy *proxy; /* ...auxiliary control buffer for control transactions */ struct xf_buffer *aux; /* ...global client-id of the component */ u32 id; /* ...local client number (think about merging into "id" field - tbd) */ u32 client; /* ...response processing hook */ xf_response_cb response; }; /* ...accessor to buffer data */ static inline void *xf_buffer_data(struct xf_buffer *buffer) { return buffer->address; } /* ...length of buffer data */ static inline size_t xf_buffer_length(struct xf_buffer *buffer) { struct xf_pool *pool = buffer->link.pool; return (size_t)pool->length; } /* ...component client-id (global scope) */ static inline u32 xf_handle_id(struct xf_handle *handle) { return handle->id; } /* ...pointer to auxiliary buffer */ static inline void *xf_handle_aux(struct xf_handle *handle) { return xf_buffer_data(handle->aux); } int xf_pool_alloc(struct xf_client *client, struct xf_proxy *proxy, u32 number, u32 length, xf_pool_type_t type, struct xf_pool **pool); int xf_pool_free(struct xf_client *client, struct xf_pool *pool); struct xf_buffer *xf_buffer_get(struct xf_pool *pool); void xf_buffer_put(struct xf_buffer *buffer); #endif /* FSL_DSP_POOL_H */