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

Reply via email to