More work on UDI support
authorJohn Hodge <tpg@prelude.(none)>
Fri, 15 Jan 2010 07:49:58 +0000 (15:49 +0800)
committerJohn Hodge <tpg@prelude.(none)>
Fri, 15 Jan 2010 07:49:58 +0000 (15:49 +0800)
Kernel/Makefile.BuildNum
Modules/UDI/Makefile
Modules/UDI/buf.c [new file with mode: 0644]
Modules/UDI/include/udi_buf.h [new file with mode: 0644]
Modules/UDI/include/udi_mem.h [new file with mode: 0644]
Modules/UDI/mem.c [new file with mode: 0644]

index 740bcb0..e9892dc 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 1321
+BUILD_NUM = 1324
index f553ad9..2658ae7 100644 (file)
@@ -2,7 +2,7 @@
 #
 
 CPPFLAGS = -I./include
-OBJ  = main.o logging.o strmem.o imc.o
+OBJ  = main.o logging.o strmem.o imc.o mem.o buf.o
 OBJ += meta_mgmt.o
 NAME = UDI
 
diff --git a/Modules/UDI/buf.c b/Modules/UDI/buf.c
new file mode 100644 (file)
index 0000000..235f3e5
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * \file buf.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_buf.h>
+
+// === EXPORTS ===
+EXPORT(udi_buf_copy);
+EXPORT(udi_buf_write);
+EXPORT(udi_buf_free);
+
+// === CODE ===
+void udi_buf_copy(
+       udi_buf_copy_call_t *callback,
+       udi_cb_t        *gcb,
+       udi_buf_t       *src_buf,
+       udi_size_t      src_off,
+       udi_size_t      src_len,
+       udi_buf_t       *dst_buf,
+       udi_size_t      dst_off,
+       udi_size_t      dst_len,
+       udi_buf_path_t path_handle
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+void udi_buf_write(
+       udi_buf_write_call_t *callback,
+       udi_cb_t        *gcb,
+       const void      *src_mem,
+       udi_size_t      src_len,
+       udi_buf_t       *dst_buf,
+       udi_size_t      dst_off,
+       udi_size_t      dst_len,
+       udi_buf_path_t path_handle
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+void udi_buf_free(udi_buf_t *buf)
+{
+       Warning("%s Unimplemented", __func__);
+}
diff --git a/Modules/UDI/include/udi_buf.h b/Modules/UDI/include/udi_buf.h
new file mode 100644 (file)
index 0000000..ebff452
--- /dev/null
@@ -0,0 +1,105 @@
+/**
+ * \file udi_buf.h
+ */
+#ifndef _UDI_BUF_H_
+#define _UDI_BUF_H_
+
+
+typedef struct udi_buf_s       udi_buf_t;
+typedef struct udi_xfer_constraints_s  udi_xfer_constraints_t;
+typedef void udi_buf_copy_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf);
+typedef void udi_buf_write_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf);
+
+/**
+ * \brief Describes a buffer
+ * \note Semi-Opaque
+ */
+struct udi_buf_s
+{
+       udi_size_t      buf_size;
+       Uint8   Data[]; //!< ENVIRONMENT ONLY
+};
+
+/**
+ * \brief 
+ */
+struct udi_xfer_constraints_s
+{
+       udi_ubit32_t    udi_xfer_max;
+       udi_ubit32_t    udi_xfer_typical;
+       udi_ubit32_t    udi_xfer_granularity;
+       udi_boolean_t   udi_xfer_one_piece;
+       udi_boolean_t   udi_xfer_exact_size;
+       udi_boolean_t   udi_xfer_no_reorder;
+};
+
+// --- MACROS ---
+/**
+ * \brief Allocates a buffer
+ */
+#define UDI_BUF_ALLOC(callback, gcb, init_data, size, path_handle) \
+       udi_buf_write(callback, gcb, init_data, size, NULL, 0, 0, path_handle)
+
+/**
+ * \brief Inserts data into a buffer
+ */
+#define UDI_BUF_INSERT(callback, gcb, new_data, size, dst_buf, dst_off) \
+       udi_buf_write(callback, gcb, new_data, size, dst_buf, dst_off, 0, UDI_NULL_BUF_PATH)
+
+/**
+ * \brief Removes data from a buffer (data afterwards will be moved forewards)
+ */
+#define UDI_BUF_DELETE(callback, gcb, size, dst_buf, dst_off) \
+       udi_buf_write(callback, gcb, NULL, 0, dst_buf, dst_off, size, UDI_NULL_BUF_PATH)
+
+/**
+ * \brief Duplicates \a src_buf
+ */
+#define UDI_BUF_DUP(callback, gcb, src_buf, path_handle) \
+       udi_buf_copy(callback, gcb, src_buf, 0, (src_buf)->buf_size, NULL, 0, 0, path_handle)
+
+
+/**
+ * \brief Copies data from one buffer to another
+ */
+extern void udi_buf_copy(
+       udi_buf_copy_call_t *callback,
+       udi_cb_t        *gcb,
+       udi_buf_t       *src_buf,
+       udi_size_t      src_off,
+       udi_size_t      src_len,
+       udi_buf_t       *dst_buf,
+       udi_size_t      dst_off,
+       udi_size_t      dst_len,
+       udi_buf_path_t path_handle );
+
+/**
+ * \brief Copies data from driver space to a buffer
+ */
+extern void udi_buf_write(
+       udi_buf_write_call_t *callback,
+       udi_cb_t        *gcb,
+       const void      *src_mem,
+       udi_size_t      src_len,
+       udi_buf_t       *dst_buf,
+       udi_size_t      dst_off,
+       udi_size_t      dst_len,
+       udi_buf_path_t path_handle
+       );
+
+/**
+ * \brief Reads data from a buffer into driver space
+ */
+extern void udi_buf_read(
+     udi_buf_t *src_buf,
+     udi_size_t        src_off,
+     udi_size_t        src_len,
+     void *dst_mem );
+
+/**
+ * \brief Frees a buffer
+ */
+extern void udi_buf_free(udi_buf_t *buf);
+
+
+#endif
diff --git a/Modules/UDI/include/udi_mem.h b/Modules/UDI/include/udi_mem.h
new file mode 100644 (file)
index 0000000..d29f25e
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * \file udi_mem.h
+ */
+#ifndef _UDI_MEM_H_
+#define _UDI_MEM_H_
+
+/**
+ * \brief Callback type for ::udi_mem_alloc
+ */
+typedef void udi_mem_alloc_call_t(udi_cb_t *gcb, void *new_mem);
+
+/**
+ * \brief Allocate memory
+ */
+extern void udi_mem_alloc(
+       udi_mem_alloc_call_t *callback,
+       udi_cb_t        *gcb,
+       udi_size_t      size,
+       udi_ubit8_t     flags
+       );
+
+/**
+ * \brief Values for ::udi_mem_alloc \a flags
+ * \{
+ */
+#define UDI_MEM_NOZERO               (1U<<0)   //!< No need to zero the memory
+#define UDI_MEM_MOVABLE              (1U<<1)   //!< Globally accessable memory?
+/**
+ * \}
+ */
+
+/**
+ * \brief Free allocated memory
+ */
+extern void udi_mem_free(void *target_mem);
+
+
+#endif
diff --git a/Modules/UDI/mem.c b/Modules/UDI/mem.c
new file mode 100644 (file)
index 0000000..06d4893
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * \file mem.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_mem.h>
+
+// === CODE ===
+void udi_mem_alloc(
+       udi_mem_alloc_call_t *callback,
+       udi_cb_t        *gcb,
+       udi_size_t      size,
+       udi_ubit8_t     flags
+       )
+{
+       void    *buf = malloc(size);
+       if(buf)
+       {
+               if( !(flags & UDI_MEM_NOZERO) )
+                       memset(buf, 0, size);
+       }
+       callback(gcb, buf);
+}
+
+void udi_mem_free(void *target_mem)
+{
+       free(target_mem);
+}
+
+// === EXPORTS ===
+EXPORT(udi_mem_alloc);
+EXPORT(udi_mem_free);

UCC git Repository :: git.ucc.asn.au