This patch contains ODP Buffer Management missing APIs The intent of this patch is to port the missing APIs from Buffer Management design document into Linux-generic repo. The dummy functions will be replaced during linux-generic implementation.
Signed-off-by: Balasubramanian Manoharan <[email protected]> --- platform/linux-generic/include/api/odp_buffer.h | 203 ++++++++++++++++++++- .../linux-generic/include/api/odp_buffer_pool.h | 30 +++ platform/linux-generic/odp_buffer.c | 120 ++++++++++++ platform/linux-generic/odp_buffer_pool.c | 7 + 4 files changed, 351 insertions(+), 9 deletions(-) diff --git a/platform/linux-generic/include/api/odp_buffer.h b/platform/linux-generic/include/api/odp_buffer.h index d8577fd..aeb75ed 100644 --- a/platform/linux-generic/include/api/odp_buffer.h +++ b/platform/linux-generic/include/api/odp_buffer.h @@ -28,8 +28,34 @@ extern "C" { */ typedef uint32_t odp_buffer_t; -#define ODP_BUFFER_INVALID (0xffffffff) /**< Invalid buffer */ +/** +* ODP buffer segment +*/ +typedef uint32_t odp_buffer_segment_t; +/** +* ODP buffer type +*/ +typedef enum odp_buffer_type { + ODP_BUFFER_TYPE_INVALID = -1, /**< Buffer type invalid */ + ODP_BUFFER_TYPE_ANY = 0, /**< Buffer that can hold any other + buffer type */ + ODP_BUFFER_TYPE_RAW = 1, /**< Raw buffer, + no additional metadata */ + ODP_BUFFER_TYPE_PACKET = 2, /**< Packet buffer */ + ODP_BUFFER_TYPE_TIMEOUT = 3 /**< Timeout buffer */ +} odp_buffer_type_e; + +/** +* ODP buffer options +*/ +typedef enum odp_buffer_opts { + ODP_BUFFER_OPTS_NONE, + ODP_BUFFER_OPTS_UNSEGMENTED +} odp_buffer_opts_e; + +#define ODP_BUFFER_INVALID (0xffffffff) /**< Invalid buffer */ +#define ODP_SEGMENT_INVALID (0xffffffff) /**< Invalid segment */ /** * Buffer start address @@ -58,14 +84,6 @@ size_t odp_buffer_size(odp_buffer_t buf); */ int odp_buffer_type(odp_buffer_t buf); -#define ODP_BUFFER_TYPE_INVALID (-1) /**< Buffer type invalid */ -#define ODP_BUFFER_TYPE_ANY 0 /**< Buffer that can hold any other - buffer type */ -#define ODP_BUFFER_TYPE_RAW 1 /**< Raw buffer, no additional metadata */ -#define ODP_BUFFER_TYPE_PACKET 2 /**< Packet buffer */ -#define ODP_BUFFER_TYPE_TIMEOUT 3 /**< Timeout buffer */ - - /** * Tests if buffer is valid * @@ -76,6 +94,110 @@ int odp_buffer_type(odp_buffer_t buf); int odp_buffer_is_valid(odp_buffer_t buf); /** + * Tests if buffer is segmented + * + * @param[in] buf Buffer handle + * + * @return 1 if buffer has more than one segment, + * otherwise 0 + */ + +int odp_buffer_is_segmented(odp_buffer_t buf); + +/** + * Get address and size of user meta data associated with a buffer + * + * @param[in] buf Buffer handle + * @param[out] udata_size Number of bytes of user meta data available + * at the returned address + * @return Address of the user meta data for this buffer + * or NULL if the buffer has no user meta data. + */ +void *odp_buffer_udata(odp_buffer_t buf, size_t *udata_size); + +/** + * Get address of user meta data associated with a buffer + * + * @param[in] buf Buffer handle + * + * @return Address of the user meta data for this buffer + * or NULL if the buffer has no user meta data. + */ +void *odp_buffer_udata_addr(odp_buffer_t buf); + +/** + * Get count of number of segments in a buffer + * + * @param[in] buf Buffer handle + * + * @return Count of the number of segments in buf + */ +size_t odp_buffer_segment_count(odp_buffer_t buf); + +/** + * Get the segment identifier for a buffer segment by index + * + * @param[in] buf Buffer handle + * @param[in] ndx Segment index of segment of interest + * + * @return Segment identifier or ODP_SEGMENT_INVALID if the + * supplied ndx is out of range. + */ +odp_buffer_segment_t odp_buffer_segment_by_index(odp_buffer_t buf, size_t ndx); + +/** + * Get the next segment identifier for a buffer segment + * + * @param[in] buf Buffer handle + * @param[in] seg Segment identifier of the previous segment + * + * @return Segment identifier of the next segment, + or ODP_SEGMENT_INVALID. + */ +odp_buffer_segment_t odp_buffer_segment_next(odp_buffer_t buf, + odp_buffer_segment_t seg); +/** + * Get start address for a specified buffer segment + * + * @param[in] buf Buffer handle + * @param[in] seg Segment identifier of the buffer to be addressed + * @param[out] seglen Returned number of bytes in this buffer + * segment available at returned address + * + * @return Segment start address or NULL + */ +void *odp_buffer_segment_map(odp_buffer_t buf, odp_buffer_segment_t seg, +size_t *seglen); + +/** + *Unmap a buffer segment + * + * @param[in] seg Buffer segment handle + */ +void odp_buffer_segment_unmap(odp_buffer_segment_t seg); + +/** +* Get start address for a specified buffer offset +* +* @param[in] buf Buffer handle +* @param[in] offset Byte offset within the buffer to be addressed +* @param[out] seglen Returned number of bytes in this buffer +* segment available at returned address +* +* @return Offset start address or NULL +*/ +void *odp_buffer_offset_map(odp_buffer_t buf, size_t offset, +size_t *seglen); + +/** + * Unmap a buffer segment by offset + * + * @param[in] buf Buffer handle + * @param[in] offset Buffer offset + */ +void odp_buffer_offset_unmap(odp_buffer_t buf, size_t offset); + +/** * Print buffer metadata to STDOUT * * @param buf Buffer handle @@ -83,6 +205,69 @@ int odp_buffer_is_valid(odp_buffer_t buf); */ void odp_buffer_print(odp_buffer_t buf); +/** + * Split a buffer into two buffers at a specified split point + * + * @param[in] buf Handle of buffer to split + * @param[in] offset Byte offset within buf to split buffer + * + * @return Buffer handle of the created split buffer + */ +odp_buffer_t odp_buffer_split(odp_buffer_t buf, size_t offset); + +/** + * Join two buffers into a single buffer + * + * @param[in] buf1 Buffer handle of first buffer to join + * @param[in] buf2 Buffer handle of second buffer to join + * + * @return Buffer handle of the joined buffer + */ +odp_buffer_t odp_buffer_join(odp_buffer_t buf1, odp_buffer_t buf2); + +/** + * Trim a buffer at a specified trim point + * + * @param[in] buf Buffer handle of buffer to trim + * @param[in] offset byte offset within buf to trim + * + * @return Handle of the trimmed buffer or + * ODP_BUFFER_INVALID if the operation was not performed + */ +odp_buffer_t odp_buffer_trim(odp_buffer_t buf, size_t offset); +/** + * Extend a buffer for a specified number of bytes + * + * @param[in] buf Buffer handle of buffer to expand + * @param[in] ext size, in bytes, of the extent to add to the + * existing buffer. + * + * @return Handle of the extended buffer or ODP_BUFFER_INVALID + * if the operation was not performed + */ +odp_buffer_t odp_buffer_extend(odp_buffer_t buf, size_t ext); + +/** + * Clone a buffer, returning an exact copy of it + * + * @param[in] buf Buffer handle of buffer to duplicate + * + * @return Handle of the duplicated buffer or ODP_BUFFER_INVALID + * if the operation was not performed + */ +odp_buffer_t odp_buffer_clone(odp_buffer_t buf); + +/** + * Copy a buffer, returning an exact copy of it + * + * @param[in] buf Buffer handle of buffer to copy + * + * @return Handle of the copied buffer or ODP_BUFFER_INVALID + * if the operation was not performed + */ +odp_buffer_t odp_buffer_copy(odp_buffer_t buf); + + #ifdef __cplusplus } diff --git a/platform/linux-generic/include/api/odp_buffer_pool.h b/platform/linux-generic/include/api/odp_buffer_pool.h index fe88898..f85d96c 100644 --- a/platform/linux-generic/include/api/odp_buffer_pool.h +++ b/platform/linux-generic/include/api/odp_buffer_pool.h @@ -52,6 +52,27 @@ odp_buffer_pool_t odp_buffer_pool_create(const char *name, /** + * Get the next buffer pool from its predecessor + * + * @param[in] pool Buffer pool handle + * @param[out] name Name of the pool + * (max ODP_BUFFER_POOL_NAME_LEN - 1 chars) + * @param[out] udata_size Size of user meta data used by this pool. + * @param[out] buf_num Number of buffers contained in this pool + * @param[out] buf_size Default size of application data in each buffer + * @param[out] buf_type Buffer type of the pool + * @param[out] buf_opts Buffer options for this pool + * @param[out] predef Predefined (1) or Created (0). + * + * @return Buffer pool handle + */ +odp_buffer_pool_t odp_buffer_pool_next(odp_buffer_pool_t pool, + char *name, size_t *udata_size, + size_t *buf_num, size_t *buf_size, + enum odp_buffer_type *buf_type, + enum odp_buffer_opts *buf_opts, + uint32_t *predef); +/** * Find a buffer pool by name * * @param name Name of the pool @@ -80,6 +101,15 @@ void odp_buffer_pool_print(odp_buffer_pool_t pool); */ odp_buffer_t odp_buffer_alloc(odp_buffer_pool_t pool); +/** +* Allocate a buffer from a buffer pool +* +* @param[in] pool Pool handle +* @param[in] size Size of object to store in buffer +* +* @return Buffer handle or ODP_BUFFER_INVALID +*/ +odp_buffer_t odp_buffer_alloc_size(odp_buffer_pool_t pool, size_t size); /** * Buffer free diff --git a/platform/linux-generic/odp_buffer.c b/platform/linux-generic/odp_buffer.c index e54e0e7..7f4b4f0 100644 --- a/platform/linux-generic/odp_buffer.c +++ b/platform/linux-generic/odp_buffer.c @@ -45,6 +45,21 @@ int odp_buffer_is_valid(odp_buffer_t buf) return (handle.index != ODP_BUFFER_INVALID_INDEX); } +int odp_buffer_is_segmented(odp_buffer_t buf) +{ + odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr(buf); + + if (buf_hdr->scatter.num_bufs == 0) + return 0; + else + return 1; +} + +size_t odp_buffer_segment_count(odp_buffer_t buf) +{ + odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr(buf); + return (size_t)buf_hdr->scatter.num_bufs + 1; +} int odp_buffer_snprint(char *str, size_t n, odp_buffer_t buf) { @@ -101,8 +116,113 @@ void odp_buffer_print(odp_buffer_t buf) printf("\n%s\n", str); } +void *odp_buffer_udata(odp_buffer_t buf, size_t *udata_size) +{ + (void)buf; + (void)udata_size; + ODP_UNIMPLEMENTED(); + return 0; +} + +void *odp_buffer_udata_addr(odp_buffer_t buf) +{ + (void)buf; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_segment_t odp_buffer_segment_by_index(odp_buffer_t buf, + size_t ndx) +{ + (void)buf; + (void)ndx; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_segment_t odp_buffer_segment_next(odp_buffer_t buf, + odp_buffer_segment_t seg) +{ + (void)buf; + (void)seg; + ODP_UNIMPLEMENTED(); + return 0; +} + +void *odp_buffer_segment_map(odp_buffer_t buf, odp_buffer_segment_t seg, + size_t *seglen) +{ + (void)buf; + (void)seg; + (void)seglen; + ODP_UNIMPLEMENTED(); + return 0; +} +void *odp_buffer_offset_map(odp_buffer_t buf, size_t offset, +size_t *seglen) +{ + (void)buf; + (void)offset; + (void)seglen; + ODP_UNIMPLEMENTED(); + return 0; +} +void odp_buffer_offset_unmap(odp_buffer_t buf, size_t offset) +{ + (void)buf; + (void)offset; + ODP_UNIMPLEMENTED(); + return; +} + void odp_buffer_copy_scatter(odp_buffer_t buf_dst, odp_buffer_t buf_src) { (void)buf_dst; (void)buf_src; } + +odp_buffer_t odp_buffer_split(odp_buffer_t buf, size_t offset) +{ + (void)buf; + (void)offset; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_t odp_buffer_join(odp_buffer_t buf1, odp_buffer_t buf2) +{ + (void)buf1; + (void)buf2; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_t odp_buffer_trim(odp_buffer_t buf, size_t offset) +{ + (void)buf; + (void)offset; + ODP_UNIMPLEMENTED(); + return 0; +} +odp_buffer_t odp_buffer_extend(odp_buffer_t buf, size_t ext) +{ + (void)buf; + (void)ext; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_t odp_buffer_clone(odp_buffer_t buf) +{ + (void)buf; + ODP_UNIMPLEMENTED(); + return 0; +} + +odp_buffer_t odp_buffer_copy(odp_buffer_t buf) +{ + (void)buf; + ODP_UNIMPLEMENTED(); + return 0; +} + diff --git a/platform/linux-generic/odp_buffer_pool.c b/platform/linux-generic/odp_buffer_pool.c index a48d7d6..bff4db5 100644 --- a/platform/linux-generic/odp_buffer_pool.c +++ b/platform/linux-generic/odp_buffer_pool.c @@ -471,6 +471,13 @@ odp_buffer_t odp_buffer_alloc(odp_buffer_pool_t pool_hdl) return handle.u32; } +odp_buffer_t odp_buffer_alloc_size(odp_buffer_pool_t pool, size_t size) +{ + (void)pool; + (void) size; + ODP_ERR("%s function is yet to be implemented", __func__); + return 0; +} void odp_buffer_free(odp_buffer_t buf) { -- 2.0.1.472.g6f92e5f _______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
