[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/iovec/iovec.c b/src/bsp/lk/lib/iovec/iovec.c
new file mode 100644
index 0000000..4ce6c0f
--- /dev/null
+++ b/src/bsp/lk/lib/iovec/iovec.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2014 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <err.h>
+#include <debug.h>
+#include <assert.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <iovec.h>
+
+#define LOCAL_TRACE 0
+
+/*
+ * Calc total size of iovec buffers
+ */
+ssize_t iovec_size (const iovec_t *iov, uint iov_cnt)
+{
+ if (!iov)
+ return (ssize_t) ERR_INVALID_ARGS;
+
+ size_t c = 0;
+ for (uint i = 0; i < iov_cnt; i++, iov++) {
+ c += iov->iov_len;
+ }
+ return (ssize_t) c;
+}
+
+/*
+ * Copy out portion of iovec started from given position
+ * into single buffer
+ */
+ssize_t iovec_to_membuf (uint8_t *buf, uint buf_len, const iovec_t *iov, uint iov_cnt, uint iov_pos)
+{
+ uint buf_pos = 0;
+
+ if (!buf || !iov)
+ return (ssize_t) ERR_INVALID_ARGS;
+
+ /* for all iovec */
+ for (uint i = 0; i < iov_cnt; i++, iov++) {
+
+ if (iov_pos >= iov->iov_len) {
+ iov_pos -= iov->iov_len; /* skip whole chunks */
+ continue;
+ }
+
+ /* calc number of bytes left in current iov */
+ size_t to_copy = (size_t) (iov->iov_len - iov_pos);
+
+ /* limit it to number of bytes left in buffer */
+ if (to_copy > buf_len)
+ to_copy = buf_len;
+
+ /* copy data out */
+ memcpy (buf + buf_pos, (uint8_t *)iov->iov_base + iov_pos, to_copy);
+
+ /* advance in buffer position */
+ buf_pos += to_copy;
+ buf_len -= to_copy;
+
+ /* check if we need to copy more data */
+ if (buf_len == 0)
+ break;
+
+ iov_pos = 0; /* it is only possible to have fully copied iovec here */
+ }
+
+ return (ssize_t) buf_pos;
+}
+
+
+// vim: set ts=4 sw=4 noexpandtab: