Modules/UDI - Implimenting UDI support, can load udi_dpt from udiref
authorJohn Hodge <[email protected]>
Mon, 16 Sep 2013 04:45:12 +0000 (12:45 +0800)
committerJohn Hodge <[email protected]>
Mon, 16 Sep 2013 04:45:12 +0000 (12:45 +0800)
47 files changed:
KernelLand/Modules/Interfaces/UDI/Makefile
KernelLand/Modules/Interfaces/UDI/buf.c [deleted file]
KernelLand/Modules/Interfaces/UDI/cb.c [deleted file]
KernelLand/Modules/Interfaces/UDI/channels.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/imc.c [deleted file]
KernelLand/Modules/Interfaces/UDI/include/physio/dma.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/include/physio/meta_intr.h
KernelLand/Modules/Interfaces/UDI/include/physio/pio.h
KernelLand/Modules/Interfaces/UDI/include/udi.h
KernelLand/Modules/Interfaces/UDI/include/udi/cb.h
KernelLand/Modules/Interfaces/UDI/include/udi/init.h
KernelLand/Modules/Interfaces/UDI/include/udi/log.h
KernelLand/Modules/Interfaces/UDI/include/udi/meta_mgmt.h
KernelLand/Modules/Interfaces/UDI/include/udi/queues.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/include/udi/strmem.h
KernelLand/Modules/Interfaces/UDI/include/udi/time.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/include/udi_physio.h
KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/logging.c [deleted file]
KernelLand/Modules/Interfaces/UDI/main.c
KernelLand/Modules/Interfaces/UDI/mem.c [deleted file]
KernelLand/Modules/Interfaces/UDI/meta_gio.c [deleted file]
KernelLand/Modules/Interfaces/UDI/meta_mgmt.c [deleted file]
KernelLand/Modules/Interfaces/UDI/physio.c [deleted file]
KernelLand/Modules/Interfaces/UDI/physio/meta_bus.c [deleted file]
KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c [deleted file]
KernelLand/Modules/Interfaces/UDI/physio_main.c [deleted file]
KernelLand/Modules/Interfaces/UDI/strmem.c [deleted file]
KernelLand/Modules/Interfaces/UDI/udi_internal.h [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/buf.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/cb.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/mem.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/meta_gio.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/physio_main.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c [new file with mode: 0644]
KernelLand/Modules/Interfaces/UDI/udi_lib/time.c [new file with mode: 0644]

index 4c199f1..9613127 100644 (file)
@@ -2,9 +2,18 @@
 #
 
 CPPFLAGS = -I./include
-OBJ  = main.o logging.o strmem.o imc.o mem.o buf.o cb.o
-OBJ += meta_mgmt.o meta_gio.o
-OBJ += physio.o physio/meta_bus.o physio/meta_intr.o
+
+# - UDI Library Files
+LIB_OBJS := logging.o strmem.o imc.o mem.o buf.o cb.o
+LIB_OBJS += queues.o time.o
+LIB_OBJS += meta_mgmt.o meta_gio.o
+LIB_OBJS += physio.o physio/meta_bus.o physio/meta_intr.o physio/pio.o physio/dma.o
+LIB_OBJS += scsi.o
+# - UDI->Acess Translation Layer
+TRANS_OBJS := 
+
+OBJ  = main.o channels.o
+OBJ += $(LIB_OBJS:%=udi_lib/%) $(TRANS_OBJS:%=trans/%)
 NAME = UDI
 
 -include ../Makefile.tpl
diff --git a/KernelLand/Modules/Interfaces/UDI/buf.c b/KernelLand/Modules/Interfaces/UDI/buf.c
deleted file mode 100644 (file)
index 5327cc8..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * \file buf.c
- * \author John Hodge (thePowersGang)
- * 
- * Buffer Manipulation
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_buf_copy);
-EXPORT(udi_buf_write);
-EXPORT(udi_buf_read);
-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
-       )
-{
-       UNIMPLEMENTED();
-}
-
-/**
- * \brief Write to a buffer
- * \param callback     Function to call once the write has completed
- * \param gcb  Control Block
- * \param src_mem      Source Data
- * \param src_len      Length of source data
- * \param dst_buf      Destination buffer
- * \param dst_off      Destination offset in the buffer
- * \param dst_len      Length of destination area (What the?, Redundant
- *                     Department of redundacny department)
- * \param path_handle  ???
- */
-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
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_buf_read(
-       udi_buf_t       *src_buf,
-       udi_size_t      src_off,
-       udi_size_t      src_len,
-       void    *dst_mem )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_buf_free(udi_buf_t *buf)
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/cb.c b/KernelLand/Modules/Interfaces/UDI/cb.c
deleted file mode 100644 (file)
index b615dfe..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * \file cb.c
- * \author John Hodge (thePowersGang)
- * \brief Control block code
- */
-#include <acess.h>
-#include <udi.h>
-
-// === CODE ===
-void udi_cb_alloc (
-       udi_cb_alloc_call_t     *callback,      //!< Function to be called when the CB is allocated
-       udi_cb_t        *gcb,   //!< Parent Control Block
-       udi_index_t     cb_idx,
-       udi_channel_t   default_channel
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_cb_alloc_dynamic(
-       udi_cb_alloc_call_t     *callback,
-       udi_cb_t        *gcb,
-       udi_index_t     cb_idx,
-       udi_channel_t   default_channel,
-       udi_size_t      inline_size,
-       udi_layout_t    *inline_layout
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_cb_alloc_batch(
-       udi_cb_alloc_batch_call_t       *callback,      //!< 
-       udi_cb_t        *gcb,   //!< 
-       udi_index_t     cb_idx,
-       udi_index_t     count,
-       udi_boolean_t   with_buf,
-       udi_size_t      buf_size,
-       udi_buf_path_t  path_handle
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_cb_free(udi_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
-{
-       UNIMPLEMENTED();
-}
-
-// === EXPORTS ===
-EXPORT(udi_cb_alloc);
-EXPORT(udi_cb_alloc_dynamic);
-EXPORT(udi_cb_alloc_batch);
-EXPORT(udi_cb_free);
-EXPORT(udi_cancel);
diff --git a/KernelLand/Modules/Interfaces/UDI/channels.c b/KernelLand/Modules/Interfaces/UDI/channels.c
new file mode 100644 (file)
index 0000000..e173747
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ */
+#define DEBUG  0
+#include <acess.h>
+#include <udi.h>
+#include "udi_internal.h"
+
+struct sUDI_ChannelSide {
+       struct sUDI_Channel     *BackPtr;
+       const void      *Ops;
+       void    *Context;
+};
+
+typedef struct sUDI_Channel
+{
+       enum eUDI_MetaLang      MetaLang;
+       struct sUDI_ChannelSide  Side[2];
+} tUDI_Channel;
+
+// === CODE ===
+udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
+       tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
+       tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex)
+{
+       tUDI_Channel    *ret = NEW(tUDI_Channel,);
+       ret->MetaLang = metalang;
+       ret->Side[0].BackPtr = ret;
+//     ret->Side[0].Ops = ThisEnd->Module->InitInfo->Op;
+       ret->Side[1].BackPtr = ret;
+       return (udi_channel_t)&ret->Side[0].BackPtr;
+}
+
+const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang)
+{
+       tUDI_Channel *ch = *(tUDI_Channel**)(gcb->channel);
+       ASSERTCR(ch->MetaLang, ==, metalang, NULL);
+
+       struct sUDI_ChannelSide *newside = (gcb->channel == (udi_channel_t)&ch->Side[0].BackPtr ? &ch->Side[1] : &ch->Side[0]);
+
+//     gcb->initiator_context = gcb->context;
+       gcb->channel = (udi_channel_t)&newside->BackPtr;
+       gcb->context = newside->Context;
+       return newside->Ops;
+}
+
diff --git a/KernelLand/Modules/Interfaces/UDI/imc.c b/KernelLand/Modules/Interfaces/UDI/imc.c
deleted file mode 100644 (file)
index cd15e07..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * \file imc.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_channel_anchor);
-EXPORT(udi_channel_spawn);
-EXPORT(udi_channel_set_context);
-EXPORT(udi_channel_op_abort);
-EXPORT(udi_channel_close);
-EXPORT(udi_channel_event_ind);
-EXPORT(udi_channel_event_complete);
-
-// === CODE ===
-/**
- */
-void udi_channel_anchor(
-       udi_channel_anchor_call_t *callback, udi_cb_t *gcb,
-       udi_channel_t channel, udi_index_t ops_idx, void *channel_context
-       )
-{
-       Warning("%s Unimplemented", __func__);
-}
-
-/**
- */
-extern void udi_channel_spawn(
-       udi_channel_spawn_call_t *callback, udi_cb_t *gcb,
-       udi_channel_t channel, udi_index_t spawn_idx,
-       udi_index_t ops_idx, void *channel_context
-       )
-{
-       Warning("%s Unimplemented", __func__);
-}
-
-/**
- * 
- */
-void udi_channel_set_context(
-       udi_channel_t target_channel, void *channel_context
-       )
-{
-       Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_op_abort(
-       udi_channel_t target_channel, udi_cb_t *orig_cb
-       )
-{
-       Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_close(udi_channel_t channel)
-{
-       Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_event_ind(udi_channel_event_cb_t *cb)
-{
-       udi_channel_event_complete(cb, UDI_OK);
-}
-
-void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status)
-{
-       Warning("%s Unimplemented", __func__);
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/dma.h b/KernelLand/Modules/Interfaces/UDI/include/physio/dma.h
new file mode 100644 (file)
index 0000000..9097634
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ */
+#ifndef _UDI_PHYSIO_DMA_H_
+#define _UDI_PHYSIO_DMA_H_
+
+//typedef struct udi_dma_handle_s      *udi_dma_handle_t;
+//#define UDI_NULL_DMA_HANDLE  NULL
+
+extern void udi_dma_limits(udi_dma_limits_t *dma_limits);
+
+typedef void udi_dma_prepare_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle);
+typedef void udi_dma_buf_map_call_t(udi_cb_t *gcb, udi_scgth_t *scgth, udi_boolean_t complete, udi_status_t status);
+typedef void udi_dma_mem_alloc_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle, void *mem_ptr, udi_size_t actual_gap, udi_boolean_t single_element, udi_scgth_t *scgth, udi_boolean_t must_swap);
+typedef void udi_dma_sync_call_t(udi_cb_t *gcb);
+typedef void udi_dma_scgth_sync_call_t(udi_cb_t *gcb);
+typedef void udi_dma_mem_to_buf_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf);
+
+/**
+ * \name Values for flags (udi_dma_prepare, udi_dma_buf_map)
+ * \{
+ */
+#define UDI_DMA_OUT    (1U<<2)
+#define UDI_DMA_IN     (1U<<3)
+#define UDI_DMA_REWIND (1U<<4)
+#define UDI_DMA_BIG_ENDIAN     (1U<<5)
+#define UDI_DMA_LITTLE_ENDIAN  (1U<<6)
+#define UDI_DMA_NEVERSWAP      (1U<<7)
+/**
+ * \}
+ */
+
+extern void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t constraints, udi_ubit8_t flags);
+
+extern void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags);
+
+extern udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size);
+
+extern void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t constraints, udi_ubit8_t flags,
+       udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap);
+
+extern void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_size_t offset, udi_size_t len, udi_ubit8_t flags);
+
+extern void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle);
+
+extern void udi_dma_mem_barrier(udi_dma_handle_t dma_handle);
+
+extern void udi_dma_free(udi_dma_handle_t dma_handle);
+
+extern void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf);
+
+#endif
+
diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h b/KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h
new file mode 100644 (file)
index 0000000..85da58a
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 
+ */
+#ifndef _UDI_DMA_CONST_H_
+#define _UDI_DMA_CONST_H_
+
+typedef void udi_dma_constraints_attr_set_call_t(udi_cb_t *gcb, udi_dma_constraints_t new_constraints, udi_status_t status);
+
+/**
+ * \name Flags for udi_dma_constraints_attr_set
+ * \{
+ */
+#define UDI_DMA_CONSTRAINTS_COPY       (1U<<0)
+/**
+ * \}
+ */
+
+extern void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t src_constraints,
+       const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length,
+       udi_ubit8_t flags);
+
+extern void udi_dma_constraints_attr_reset(udi_dma_constraints_t constraints, udi_dma_constraints_attr_t attr_type);
+
+extern void udi_dma_constraints_free(udi_dma_constraints_t constraints);
+
+#endif
index d5dd394..506eb0c 100644 (file)
@@ -74,11 +74,11 @@ struct udi_intr_event_cb_s
 
 extern void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb);
 extern void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
-extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
+//extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
 
 extern void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb);
 extern void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb);
-extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb);
+//extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb);
 
 
 extern void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
index 1ce305f..cbb054b 100644 (file)
@@ -6,10 +6,98 @@
 
 #include <udi.h>
 #include <udi_physio.h>
-
-
 typedef _udi_handle_t  udi_pio_handle_t;
 /* Null handle value for udi_pio_handle_t */
 #define UDI_NULL_PIO_HANDLE    _NULL_HANDLE
 
+typedef void udi_pio_map_call_t(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle);
+
+typedef const struct {
+       udi_ubit8_t     pio_op;
+       udi_ubit8_t     tran_size;
+       udi_ubit16_t    operand;
+} udi_pio_trans_t;
+
+/**
+ * \brief Values for tran_size
+ */
+enum {
+       UDI_PIO_1BYTE,
+       UDI_PIO_2BYTE,
+       UDI_PIO_4BYTE,
+       UDI_PIO_8BYTE,
+       UDI_PIO_16BYTE,
+       UDI_PIO_32BYTE,
+};
+
+//! \brief PIO Handle Layout Element Type Code
+#define UDI_DL_PIO_HANDLE_T    200
+
+/**
+ * \name PIO Handle Allocation and Initialisation
+ * \{
+ */
+
+/**
+ * \name Values for pio_attributes of udi_pio_map
+ * \{
+ */
+#define UDI_PIO_STRICTORDER    (1U<<0)
+#define UDI_PIO_UNORDERED_OK   (1U<<1)
+#define UDI_PIO_MERGING_OK     (1U<<2)
+#define UDI_PIO_LOADCACHING_OK (1U<<3)
+#define UDI_PIO_STORECACHING_OK        (1U<<4)
+#define UDI_PIO_BIG_ENDIAN     (1U<<5)
+#define UDI_PIO_LITTLE_ENDIAN  (1U<<6)
+#define UDI_PIO_NEVERSWAP      (1U<<7)
+#define UDI_PIO_UNALIGNED      (1U<<8)
+/**
+ * \}
+ */
+
+extern void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb,
+       udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length,
+       udi_pio_trans_t *trans_list, udi_ubit16_t list_length,
+       udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain);
+
+extern void udi_pio_unmap(udi_pio_handle_t pio_handle);
+
+extern udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle);
+
+extern void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement);
+
+/**
+ * \}
+ */
+
+/**
+ * \name PIO Access Service Calls
+ * \{
+ */
+typedef void udi_pio_trans_call_t(udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit16_t result);
+
+extern void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb,
+       udi_pio_handle_t pio_handle, udi_index_t start_label,
+       udi_buf_t *buf, void *mem_ptr);
+
+typedef void udi_pio_probe_call_t(udi_cb_t *gcb, udi_status_t status);
+
+/**
+ * \name Values for direction
+ * \{
+ */
+#define UDI_PIO_IN     0x00
+#define UDI_PIO_OUT    0x20
+/**
+ * \}
+ */
+
+extern void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,
+       udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset,
+       udi_ubit8_t tran_size, udi_ubit8_t direction);
+
+/**
+ * \}
+ */
+
 #endif
index 53953c0..28f3497 100644 (file)
@@ -79,11 +79,29 @@ typedef const udi_ubit8_t   udi_layout_t;
  */
 
 
+typedef struct udi_init_s              udi_init_t;
+typedef struct udi_primary_init_s      udi_primary_init_t;
+typedef struct udi_secondary_init_s    udi_secondary_init_t;
+typedef struct udi_ops_init_s  udi_ops_init_t;
+typedef struct udi_cb_init_s   udi_cb_init_t;
+typedef struct udi_cb_select_s udi_cb_select_t;
+typedef struct udi_gcb_init_s  udi_gcb_init_t;
+
+typedef struct udi_init_context_s      udi_init_context_t;
+typedef struct udi_limits_s            udi_limits_t;
+typedef struct udi_chan_context_s      udi_chan_context_t;
+typedef struct udi_child_chan_context_s        udi_child_chan_context_t;
+
+typedef void   udi_op_t(void);
+typedef udi_op_t * const       udi_ops_vector_t;
+
 // === INCLUDE SUB-SECTIONS ===
 #include "udi/cb.h"    // Control Blocks
+#include "udi/time.h"  // Timer Services
 #include "udi/log.h"   // Logging
 #include "udi/attr.h"  // Attributes
 #include "udi/strmem.h"        // String/Memory
+#include "udi/queues.h"        // Queues
 #include "udi/buf.h"   // Buffers
 #include "udi/mem.h"   // Memory Management
 #include "udi/imc.h"   // Inter-module Communication
index 76db5c6..cd8ea1b 100644 (file)
@@ -32,7 +32,7 @@ struct udi_cb_s
         */
        void    *scratch;
        /**
-        * \brief ???
+        * \brief Source-usable value
         */
        void    *initiator_context;
        /**
index a6d5bb4..6189e8d 100644 (file)
@@ -4,22 +4,6 @@
 #ifndef _UDI_INIT_H_
 #define _UDI_INIT_H_
 
-typedef struct udi_init_s              udi_init_t;
-typedef struct udi_primary_init_s      udi_primary_init_t;
-typedef struct udi_secondary_init_s    udi_secondary_init_t;
-typedef struct udi_ops_init_s  udi_ops_init_t;
-typedef struct udi_cb_init_s   udi_cb_init_t;
-typedef struct udi_cb_select_s udi_cb_select_t;
-typedef struct udi_gcb_init_s  udi_gcb_init_t;
-
-typedef struct udi_init_context_s      udi_init_context_t;
-typedef struct udi_limits_s            udi_limits_t;
-typedef struct udi_chan_context_s      udi_chan_context_t;
-typedef struct udi_child_chan_context_s        udi_child_chan_context_t;
-
-typedef void   udi_op_t(void);
-typedef udi_op_t * const       udi_ops_vector_t;
-
 /**
  * \brief UDI Initialisation Structure
  * 
index dccb124..bc28735 100644 (file)
@@ -9,6 +9,43 @@
  */
 typedef udi_ubit32_t   udi_trevent_t;
 
+/**
+ * \name Values for udi_trevent_t
+ * \note Taken from UDI Spec 1.01
+ * \{
+ */
+/* Common Trace Events */
+#define UDI_TREVENT_LOCAL_PROC_ENTRY   (1U<<0)
+#define UDI_TREVENT_LOCAL_PROC_EXIT    (1U<<1)
+#define UDI_TREVENT_EXTERNAL_ERROR     (1U<<2)
+/* Common Metalanguage-Selectable Trace Events */
+#define UDI_TREVENT_IO_SCHEDULED       (1U<<6)
+#define UDI_TREVENT_IO_COMPLETED       (1U<<7)
+/* Metalanguage-Specific Trace Events */
+#define UDI_TREVENT_META_SPECIFIC_1    (1U<<11)
+#define UDI_TREVENT_META_SPECIFIC_2    (1U<<12)
+#define UDI_TREVENT_META_SPECIFIC_3    (1U<<13)
+#define UDI_TREVENT_META_SPECIFIC_4    (1U<<14)
+#define UDI_TREVENT_META_SPECIFIC_5    (1U<<15)
+/* Driver-Specific Trace Events */
+#define UDI_TREVENT_INTERNAL_1 (1U<<16)
+#define UDI_TREVENT_INTERNAL_2 (1U<<17)
+#define UDI_TREVENT_INTERNAL_3 (1U<<18)
+#define UDI_TREVENT_INTERNAL_4 (1U<<19)
+#define UDI_TREVENT_INTERNAL_5 (1U<<20)
+#define UDI_TREVENT_INTERNAL_6 (1U<<21)
+#define UDI_TREVENT_INTERNAL_7 (1U<<22)
+#define UDI_TREVENT_INTERNAL_8 (1U<<23)
+#define UDI_TREVENT_INTERNAL_9 (1U<<24)
+#define UDI_TREVENT_INTERNAL_10        (1U<<25)
+#define UDI_TREVENT_INTERNAL_11        (1U<<26)
+#define UDI_TREVENT_INTERNAL_12        (1U<<27)
+#define UDI_TREVENT_INTERNAL_13        (1U<<28)
+#define UDI_TREVENT_INTERNAL_14        (1U<<29)
+#define UDI_TREVENT_INTERNAL_15        (1U<<30)
+/* Logging Event */
+#define UDI_TREVENT_LOG        (1U<<31)
+
 /**
  * \brief Log Callback
  */
@@ -27,5 +64,18 @@ typedef void udi_log_write_call_t(udi_cb_t *gcb, udi_status_t correlated_status)
  * \}
  */
 
+extern void udi_trace_write(udi_init_context_t *init_context,
+       udi_trevent_t trace_event, udi_index_t meta_idx,
+       udi_ubit32_t msgnum, ...);
+
+extern void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
+       udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx, udi_status_t original_status,
+       udi_ubit32_t msgnum, ... );
+
+extern void udi_assert(udi_boolean_t expr);
+
+extern void udi_debug_break(udi_init_context_t *init_context, const char *message);
+
+extern void udi_debug_printf(const char *format, ...);
 
 #endif
index 97eccf2..a913552 100644 (file)
@@ -22,17 +22,22 @@ typedef void udi_usage_ind_op_t(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
 #define UDI_RESOURCES_PLENTIFUL    4
 /* Proxy */
 extern void    udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
+
+extern void    udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
 /**
  * \}
  */
 
 typedef void udi_usage_res_op_t(udi_usage_cb_t *cb);
 
+extern void    udi_usage_res(udi_usage_cb_t *cb);
+
 /**
  * \name Enumerate this driver
  * \{
  */
 typedef void udi_enumerate_req_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
+extern void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
 /* Values for enumeration_level */
 #define UDI_ENUMERATE_START           1
 #define UDI_ENUMERATE_START_RESCAN    2
@@ -60,6 +65,7 @@ typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumerat
 #define UDI_ENUMERATE_REMOVED_SELF   5
 #define UDI_ENUMERATE_RELEASED       6
 #define UDI_ENUMERATE_FAILED         255
+extern void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx);
 /**
  * \}
  */
diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/queues.h b/KernelLand/Modules/Interfaces/UDI/include/udi/queues.h
new file mode 100644 (file)
index 0000000..c19ec95
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ * \file udi_queues.h
+ * \brief Queue Management Utility Functions
+ */
+#ifndef _UDI_QUEUES_H_
+#define _UDI_QUEUES_H_
+
+typedef struct udi_queue       udi_queue_t;
+
+struct udi_queue
+{
+       struct udi_queue *next;
+       struct udi_queue *prev;
+};
+
+extern void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el);
+extern udi_queue_t *udi_dequeue(udi_queue_t *element);
+
+#define UDI_QUEUE_INIT(listhead)       ((listhead)->next = (listhead)->prev = (listhead))
+#define UDI_QUEUE_EMPTY(listhead)      ((listhead)->next == (listhead)->prev)
+// TODO: other queue macros
+
+#endif
+
index f540a3e..b5de131 100644 (file)
@@ -38,6 +38,7 @@ extern udi_ubit32_t udi_strtou32(const char *s, char **endptr, int base);
 
 
 extern udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...);
+extern udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap);
 
 
 
diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/time.h b/KernelLand/Modules/Interfaces/UDI/include/udi/time.h
new file mode 100644 (file)
index 0000000..2654ce8
--- /dev/null
@@ -0,0 +1,22 @@
+
+#ifndef _UDI_TIME_H_
+#define _UDI_TIME_H_
+
+typedef struct {
+       udi_ubit32_t    seconds;
+       udi_ubit32_t    nanoseconds;
+} udi_time_t;
+
+typedef void udi_timer_expired_call_t(udi_cb_t *gcb);
+typedef void udi_timer_tick_call_t(udi_cb_t *gcb, udi_ubit32_t missed);
+
+extern void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval);
+extern void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval);
+extern void udi_timer_cancel(udi_cb_t *gcb);
+
+extern udi_timestamp_t udi_time_current(void);
+extern udi_time_t      udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time);
+extern udi_time_t      udi_time_since(udi_timestamp_t start_time);
+
+#endif
+
index 1397b1c..818257e 100644 (file)
@@ -118,27 +118,10 @@ struct udi_scgth_s
 
 
 // === FUNCTIONS ===
-// --- DMA Constraints Management ---
-extern void udi_dma_constraints_attr_set(
-       udi_dma_constraints_attr_set_call_t     *callback,
-       udi_cb_t        *gcb,
-       udi_dma_constraints_t   src_constraints,
-       const udi_dma_constraints_attr_spec_t   *attr_list,
-       udi_ubit16_t    list_length,
-       udi_ubit8_t     flags
-       );
-/* Constraints Flags */
-#define UDI_DMA_CONSTRAINTS_COPY (1U<<0)
-
-extern void udi_dma_constraints_attr_reset(
-       udi_dma_constraints_t   constraints,
-       udi_dma_constraints_attr_t      attr_type
-       );
-
-extern void udi_dma_constraints_free(udi_dma_constraints_t constraints);
-
+#include <physio/dma_const.h>
+#include <physio/dma.h>
 #include <physio/meta_intr.h>
 #include <physio/meta_bus.h>
-
+#include <physio/pio.h>
 
 #endif
diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h b/KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h
new file mode 100644 (file)
index 0000000..234ab85
--- /dev/null
@@ -0,0 +1,134 @@
+/**
+ * \file udi_scsi.h
+ * \brief UDI SCSI Bindings
+ */
+#ifndef _UDI_SCSI_H_
+#define _UDI_SCSI_H_
+
+typedef struct {
+       udi_cb_t        gcb;
+       udi_ubit16_t    events;
+} udi_scsi_bind_cb_t;
+
+#define UDI_SCSI_BIND_CB_NUM   1
+
+/* SCSI Events */
+#define UDI_SCSI_EVENT_AEN     (1U<<0)
+#define UDI_SCSI_EVENT_TGT_RESET       (1U<<1)
+#define UDI_SCSI_EVENT_BUS_RESET       (1U<<2)
+#define UDI_SCSI_EVENT_UNSOLICITED_RESELECT    (1U<<3)
+
+typedef struct {
+       udi_cb_t        gcb;
+       udi_buf_t       *data_buf;
+       udi_ubit32_t    timeout;
+       udi_ubit16_t    flags;
+       udi_ubit8_t     attribute;
+       udi_ubit8_t     cdb_len;
+       udi_ubit8_t     *cdb_ptr;
+} udi_scsi_io_cb_t;
+/* Control Block Group Number */
+#define UDI_SCSI_IO_CB_NUM 2
+/* I/O Request Flags */
+#define UDI_SCSI_DATA_IN (1U<<0)
+#define UDI_SCSI_DATA_OUT (1U<<1)
+#define UDI_SCSI_NO_DISCONNECT (1U<<2)
+/* SCSI Task Attributes */
+#define UDI_SCSI_SIMPLE_TASK 1
+#define UDI_SCSI_ORDERED_TASK 2
+#define UDI_SCSI_HEAD_OF_Q_TASK 3
+#define UDI_SCSI_ACA_TASK 4
+#define UDI_SCSI_UNTAGGED_TASK 5
+
+typedef struct {
+       udi_status_t    req_status;
+       udi_ubit8_t     scsi_status;
+       udi_ubit8_t     sense_status;
+} udi_scsi_status_t;
+
+typedef struct {
+       udi_cb_t        gcb;
+       udi_ubit8_t     ctrl_func;
+       udi_ubit16_t    queue_depth;
+} udi_scsi_ctl_cb_t;
+/* Values for ctrl_func */
+#define UDI_SCSI_CTL_ABORT_TASK_SET    1
+#define UDI_SCSI_CTL_CLEAR_TASK_SET    2
+#define UDI_SCSI_CTL_LUN_RESET         3
+#define UDI_SCSI_CTL_TGT_RESET         4
+#define UDI_SCSI_CTL_BUS_RESET         5
+#define UDI_SCSI_CTL_CLEAR_ACA         6
+#define UDI_SCSI_CTL_SET_QUEUE_DEPTH   7
+/* Control Block Group Number */
+#define UDI_SCSI_CTL_CB_NUM    3
+
+typedef struct {
+       udi_cb_t        gcb;
+       udi_ubit8_t     event;
+       udi_buf_t       *aen_data_buf;
+} udi_scsi_event_cb_t;
+/* Control Block Group Number */
+#define UDI_SCSI_EVENT_CB_NUM 4
+
+typedef void udi_scsi_bind_ack_op_t(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status);
+typedef void udi_scsi_unbind_ack_op_t(udi_scsi_bind_cb_t *cb);
+typedef void udi_scsi_io_ack_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_io_nak_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_ctl_ack_op_t(udi_scsi_ctl_cb_t *cb, udi_status_t status);
+typedef void udi_scsi_event_ind_op_t(udi_scsi_event_cb_t *cb);
+
+typedef void udi_scsi_bind_req_op_t(udi_scsi_bind_cb_t *cb,
+       udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+       udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size);
+typedef void udi_scsi_unbind_req_op_t(udi_scsi_bind_cb_t *cb);
+typedef void udi_scsi_io_req_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_ctl_req_op_t(udi_scsi_ctl_cb_t *cb);
+typedef void udi_scsi_event_res_op_t(udi_scsi_event_cb_t *cb);
+
+typedef const struct {
+       udi_channel_event_ind_op_t      *channel_event_ind_op;
+       udi_scsi_bind_ack_op_t  *bind_ack_op;
+       udi_scsi_unbind_ack_op_t        *unbind_ack_op;
+       udi_scsi_io_ack_op_t    *io_ack_op;
+       udi_scsi_io_nak_op_t    *io_nak_op;
+       udi_scsi_ctl_ack_op_t   *ctl_ack_op;
+       udi_scsi_event_ind_op_t *event_ind_op;
+} udi_scsi_pd_ops_t;
+
+#define UDI_SCSI_PD_OPS_NUM    1
+
+typedef const struct {
+       udi_channel_event_ind_op_t      *channel_event_ind_op;
+       udi_scsi_bind_req_op_t  *bind_req_op;
+       udi_scsi_unbind_req_op_t        *unbind_req_op;
+       udi_scsi_io_req_op_t    *io_req_op;
+       udi_scsi_ctl_req_op_t   *ctl_req_op;
+       udi_scsi_event_res_op_t *event_res_op;
+} udi_scsi_hd_ops_t;
+
+#define UDI_SCSI_HD_OPS_NUM    2
+
+/* Bind Flags */
+#define UDI_SCSI_BIND_EXCLUSIVE (1U<<0)
+#define UDI_SCSI_TEMP_BIND_EXCLUSIVE (1U<<1)
+
+extern void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb,
+       udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+       udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size);
+extern void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status);
+extern void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb);
+extern void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb);
+
+extern void udi_scsi_io_req(udi_scsi_io_cb_t *cb);
+extern void udi_scsi_io_ack(udi_scsi_io_cb_t *cb);
+extern void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf);
+extern void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb);
+extern void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status);
+extern void udi_scsi_event_ind(udi_scsi_event_cb_t *cb);
+extern udi_scsi_event_ind_op_t udi_scsi_event_ind_unused;
+extern void udi_scsi_event_res(udi_scsi_event_cb_t *cb);
+extern void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str);
+
+
+#endif
+
diff --git a/KernelLand/Modules/Interfaces/UDI/logging.c b/KernelLand/Modules/Interfaces/UDI/logging.c
deleted file mode 100644 (file)
index 2e58e37..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * \file logging.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === PROTOTYPES ===
-
-// === CODE ===
-void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
-       udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx,
-       udi_status_t original_status, udi_ubit32_t msgnum, ... )
-{
-       Log("UDI Log");
-}
-
-EXPORT(udi_log_write);
index 05aa566..7b36de9 100644 (file)
@@ -6,12 +6,16 @@
 #include <acess.h>
 #include <modules.h>
 #include <udi.h>
+#include "udi_internal.h"
 
 // === PROTOTYPES ===
  int   UDI_Install(char **Arguments);
  int   UDI_DetectDriver(void *Base);
  int   UDI_LoadDriver(void *Base);
 
+tUDI_DriverInstance    *UDI_CreateInstance(tUDI_DriverModule *DriverModule);
+tUDI_DriverRegion      *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize);
+
 // === GLOBALS ===
 MODULE_DEFINE(0, VERSION, UDI, UDI_Install, NULL, NULL);
 tModuleLoader  gUDI_Loader = {
@@ -34,7 +38,17 @@ int UDI_Install(char **Arguments)
  */
 int UDI_DetectDriver(void *Base)
 {
-       if( Binary_FindSymbol(Base, "udi_init_info", NULL) == 0) {
+       Uint    unused;
+       
+       if( Binary_FindSymbol(Base, "udi_init_info", &unused) == 0) {
+               return 0;
+       }
+       if( Binary_FindSymbol(Base, "_udiprops", &unused) == 0 ) {
+               Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops symbol");
+               return 0;
+       }
+       if( Binary_FindSymbol(Base, "_udiprops_end", &unused) == 0) {
+               Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops_end symbol");
                return 0;
        }
        
@@ -48,9 +62,7 @@ int UDI_LoadDriver(void *Base)
 {
        udi_init_t      *info;
        char    *udiprops = NULL;
-       Uint    udiprops_size = 0;
-        int    i;
-       // int  j;
+       char    *udiprops_end = 0;
        
        ENTER("pBase", Base);
        
@@ -60,44 +72,10 @@ int UDI_LoadDriver(void *Base)
                return 0;
        }
        
-       if( Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops) == 0 ) {
-               Log_Warning("UDI", "_udiprops is not defined, this is usually bad");
-       }
-       else if( Binary_FindSymbol(Base, "_udiprops_size", &udiprops_size) == 0) {
-               Log_Warning("UDI", "_udiprops_size is not defined");
-       }
-       else {
-                int    i, j, nLines;
-               char    **udipropsptrs;
-               
-               Log_Debug("UDI", "udiprops = %p, udiprops_size = 0x%x", udiprops, udiprops_size);
-               
-               Debug_HexDump("UDI_LoadDriver", udiprops, udiprops_size);
-               
-               nLines = 1;
-               for( i = 0; i < udiprops_size; i++ )
-               {
-                       if( udiprops[i] == '\0' )
-                               nLines ++;
-               }
-               
-               Log_Debug("UDI", "nLines = %i", nLines);
-               
-               udipropsptrs = malloc( sizeof(char*)*nLines );
-               udipropsptrs[0] = udiprops;
-               j = 0;
-               for( i = 0; i < udiprops_size; i++ )
-               {
-                       if( udiprops[i] == '\0' ) {
-                               //Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
-                               udipropsptrs[j++] = &udiprops[i+1];
-                       }
-               }
-               Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
-               Log_Debug("UDI", "udiprops = \"%s\"", udiprops);
-       }
-       
-       
+       Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops);
+       Binary_FindSymbol(Base, "_udiprops_end", (Uint*)&udiprops_end);
+
+       #if 0   
        Log("primary_init_info = %p = {", info->primary_init_info);
        {
                Log(" .mgmt_ops = %p = {", info->primary_init_info->mgmt_ops);
@@ -125,10 +103,16 @@ int UDI_LoadDriver(void *Base)
                Log(" .per_parent_paths = 0x%x", info->primary_init_info->per_parent_paths);
        }
        Log("}");
-       Log("secondary_init_list = %p", info->secondary_init_list);
+       Log("secondary_init_list = %p {", info->secondary_init_list);
+       for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ )
+       {
+               Log(" [%i] = { .region_idx=%i, .rdata_size=0x%x }",
+                       info->secondary_init_list[i].region_idx, info->secondary_init_list[i].rdata_size);
+       }
+       LOG("}");
        Log("ops_init_list = %p", info->ops_init_list);
        
-       for( i = 0; info->ops_init_list[i].ops_idx; i++ )
+       for( int i = 0; info->ops_init_list[i].ops_idx; i++ )
        {
                Log("info->ops_init_list[%i] = {", i);
                Log(" .ops_idx = 0x%x", info->ops_init_list[i].ops_idx);
@@ -139,6 +123,163 @@ int UDI_LoadDriver(void *Base)
 //             Log(" .op_flags = %p", info->ops_init_list[i].op_flags);
                Log("}");
        }
+       #endif
+
+       
+       // TODO: Multiple modules?
+       tUDI_DriverModule *driver_module = NEW(tUDI_DriverModule,);
+       driver_module->InitInfo = info;
+
+       // - Parse udiprops
+       {
+               char    **udipropsptrs;
+               
+               Log_Debug("UDI", "udiprops = %p, udiprops_end = %p", udiprops, udiprops_end);
+               size_t  udiprops_size = udiprops_end - udiprops;
+               
+               int nLines = 1;
+               for( int i = 0; i < udiprops_size; i++ )
+               {
+                       if( udiprops[i] == '\0' )
+                               nLines ++;
+               }
+               
+               Log_Debug("UDI", "nLines = %i", nLines);
+               
+               udipropsptrs = NEW(char*,*nLines);
+               int line = 0;
+               udipropsptrs[line++] = udiprops;
+               for( int i = 0; i < udiprops_size; i++ )
+               {
+                       if( udiprops[i] == '\0' ) {
+                               udipropsptrs[line++] = &udiprops[i+1];
+                       }
+               }
+               if(udipropsptrs[line-1] == &udiprops[udiprops_size])
+                       nLines --;
+               
+               for( int i = 0; i < nLines; i ++ )
+               {
+               }
+               
+               // Parse out:
+               // 'message' into driver_module->Messages
+               // 'region' into driver_module->RegionTypes
+               // 'module' into driver_module->ModuleName
+               
+                int    nMessages = 0;
+                int    nLocales = 1;
+                int    nRegionTypes = 0;
+               for( int i = 0; i < nLines; i ++ )
+               {
+                       const char *str = udipropsptrs[i];
+                       if( strncmp("module ", str, 7) == 0 ) {
+                               driver_module->ModuleName = str + 7;
+                       }
+                       else if( strncmp("message ", str, 8) == 0 ) {
+                               nMessages ++;
+                       }
+                       else if( strncmp("locale ", str, 7) == 0 ) {
+                               nLocales ++;
+                       }
+                       else if( strncmp("region ", str, 7) == 0 ) {
+                               nRegionTypes ++;
+                       }
+               }
+
+               // Allocate structures
+               driver_module->nMessages = nMessages;
+               driver_module->Messages = NEW(tUDI_PropMessage, *nMessages);
+               driver_module->nRegionTypes = nRegionTypes;
+               driver_module->RegionTypes = NEW(tUDI_PropRegion, *nRegionTypes);
+
+               // Populate
+                int    cur_locale = 0;
+                int    msg_index = 0;
+               for( int i = 0; i < nLines; i ++ )
+               {
+                       const char *str = udipropsptrs[i];
+                       if( strncmp("module ", str, 7) == 0 ) {
+                               driver_module->ModuleName = str + 7;
+                       }
+                       else if( strncmp("message ", str, 8) == 0 ) {
+                               tUDI_PropMessage *msg = &driver_module->Messages[msg_index++];
+                               char    *end;
+                               msg->locale = cur_locale;
+                               msg->index = strtoul(str+8, &end, 10);
+                               if( *end != ' ' && *end != '\t' ) {
+                                       // Oops.
+                                       continue ;
+                               }
+                               while( isspace(*end) )
+                                       end ++;
+                               msg->string = end;
+                               
+                               Log_Debug("UDI", "Message %i/%i: '%s'", msg->locale, msg->index, msg->string);
+                       }
+                       else if( strncmp("locale ", str, 7) == 0 ) {
+                               // TODO: Set locale
+                               cur_locale = 1;
+                       }
+                       else if( strncmp("region ", str, 7) == 0 ) {
+                               nRegionTypes ++;
+                       }
+                       else {
+                               Log_Debug("UDI", "udipropsptrs[%i] = '%s'", i, udipropsptrs[i]);
+                       }
+               }
+               
+               // Sort message list
+               // TODO: Sort message list
+       }
+
+        int    nSecondaryRgns = 0;
+       for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ )
+               nSecondaryRgns ++;
+       driver_module->nSecondaryRegions = nSecondaryRgns;
+       
+       // Create initial driver instance
+       tUDI_DriverInstance *inst = UDI_CreateInstance(driver_module);
+
+       for( int i = 0; i < 1+driver_module->nSecondaryRegions; i ++ )
+               Log("Rgn %i: %p", i, inst->Regions[i]);
+
+       // Send usage indication
+       udi_usage_cb_t ucb;
+       memset(&ucb, 0, sizeof(ucb));
+       ucb.gcb.channel = inst->ManagementChannel;
+       udi_usage_ind(&ucb, UDI_RESOURCES_NORMAL);
        
        return 0;
 }
+
+tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule)
+{
+       tUDI_DriverInstance     *inst = NEW_wA(tUDI_DriverInstance, Regions, (1+DriverModule->nSecondaryRegions));
+       inst->Module = DriverModule;
+       inst->Regions[0] = UDI_InitRegion(inst, 0, 0, DriverModule->InitInfo->primary_init_info->rdata_size);
+       udi_secondary_init_t    *sec_init = DriverModule->InitInfo->secondary_init_list;
+       if( sec_init )
+       {
+               for( int i = 0; sec_init[i].region_idx; i ++ )
+               {
+                       inst->Regions[1+i] = UDI_InitRegion(inst, i, sec_init[i].region_idx, sec_init[i].rdata_size);
+               }
+       }
+
+       inst->ManagementChannel = UDI_CreateChannel(METALANG_MGMT, 0, NULL, 0, inst, 0);
+       
+       return inst;
+}
+
+tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize)
+{
+//     ASSERTCR( RDataSize, <=, UDI_MIN_ALLOC_LIMIT, NULL );
+       ASSERTCR( RDataSize, >, sizeof(udi_init_context_t), NULL );
+       tUDI_DriverRegion       *rgn = NEW(tUDI_DriverRegion,+RDataSize);
+       rgn->InitContext = (void*)(rgn+1);
+       rgn->InitContext->region_idx = Type;
+//     rgn->InitContext->limits
+       return rgn;
+}
+
diff --git a/KernelLand/Modules/Interfaces/UDI/mem.c b/KernelLand/Modules/Interfaces/UDI/mem.c
deleted file mode 100644 (file)
index a09d54c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * \file mem.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_mem_alloc);
-EXPORT(udi_mem_free);
-
-// === 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);
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/meta_gio.c b/KernelLand/Modules/Interfaces/UDI/meta_gio.c
deleted file mode 100644 (file)
index 1618c27..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * \file meta_gio.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_gio_bind_req);
-EXPORT(udi_gio_bind_ack);
-EXPORT(udi_gio_unbind_req);
-EXPORT(udi_gio_unbind_ack);
-EXPORT(udi_gio_xfer_req);
-EXPORT(udi_gio_xfer_ack);
-EXPORT(udi_gio_xfer_nak);
-EXPORT(udi_gio_event_res);
-EXPORT(udi_gio_event_ind);
-EXPORT(udi_gio_event_res_unused);
-
-// === CODE ===
-void udi_gio_bind_req(udi_gio_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_bind_ack(
-       udi_gio_bind_cb_t       *cb,
-       udi_ubit32_t    device_size_lo,
-       udi_ubit32_t    device_size_hi,
-       udi_status_t    status
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_gio_unbind_req(udi_gio_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_gio_event_res(udi_gio_event_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_event_ind(udi_gio_event_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_gio_event_res_unused(udi_gio_event_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/meta_mgmt.c b/KernelLand/Modules/Interfaces/UDI/meta_mgmt.c
deleted file mode 100644 (file)
index 45a02c4..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * \file meta_mgmt.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_devmgmt_req);
-EXPORT(udi_devmgmt_ack);
-EXPORT(udi_final_cleanup_req);
-EXPORT(udi_final_cleanup_ack);
-EXPORT(udi_static_usage);
-EXPORT(udi_enumerate_no_children);
-
-// === CODE ===
-void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
-{      
-       ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
-       LEAVE('-');
-}
-
-void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
-{
-       ENTER("pcb xflags istatus", cb, flags, status);
-       LEAVE('-');
-}
-
-void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
-{
-       ENTER("pcb", cb);
-       LEAVE('-');
-}
-
-void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)
-{
-       ENTER("pcb", cb);
-       LEAVE('-');
-}
-
-void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/physio.c b/KernelLand/Modules/Interfaces/UDI/physio.c
deleted file mode 100644 (file)
index 881c9f4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * \file physio.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_dma_constraints_attr_reset);
-EXPORT(udi_dma_constraints_free);
-
-// === CODE ===
-void udi_dma_constraints_attr_reset(
-       udi_dma_constraints_t   constraints,
-       udi_dma_constraints_attr_t      attr_type
-       )
-{
-       UNIMPLEMENTED();
-}
-
-void udi_dma_constraints_free(udi_dma_constraints_t constraints)
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/physio/meta_bus.c b/KernelLand/Modules/Interfaces/UDI/physio/meta_bus.c
deleted file mode 100644 (file)
index e1e6a47..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * \file physio/meta_bus.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_bus_unbind_req);
-EXPORT(udi_bus_unbind_ack);
-EXPORT(udi_bus_bind_req);
-EXPORT(udi_bus_bind_ack);
-
-// === CODE ===
-void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_bus_bind_ack(
-       udi_bus_bind_cb_t       *cb,
-       udi_dma_constraints_t   dma_constraints,
-       udi_ubit8_t     preferred_endianness,
-       udi_status_t    status
-       )
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c b/KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c
deleted file mode 100644 (file)
index f4f5096..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * \file physio/meta_intr.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_intr_attach_req);
-EXPORT(udi_intr_attach_ack);
-EXPORT(udi_intr_attach_ack_unused);
-EXPORT(udi_intr_detach_req);
-EXPORT(udi_intr_detach_ack);
-EXPORT(udi_intr_detach_ack_unused);
-EXPORT(udi_intr_event_ind);
-
-// === CODE ===
-void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
-{
-       UNIMPLEMENTED();
-}
-void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
-{
-       UNIMPLEMENTED();
-}
-void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
-{
-       UNIMPLEMENTED();
-}
-
-void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags)
-{
-       UNIMPLEMENTED();
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/physio_main.c b/KernelLand/Modules/Interfaces/UDI/physio_main.c
deleted file mode 100644 (file)
index f5e7aa0..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * \file logging.c
- * \author John Hodge (thePowersGang)
- */
-#include <common.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === CODE ===
-void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
-{
-}
-
-void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
-{
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/strmem.c b/KernelLand/Modules/Interfaces/UDI/strmem.c
deleted file mode 100644 (file)
index 53cc933..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * \file strmem.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_snprintf);
-
-// === CODE ===
-udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...)
-{
-       udi_size_t      ret;
-       va_list args;
-       va_start(args, format);
-       
-       ret = vsnprintf(s, max_bytes, format, args);
-       
-       va_end(args);
-       return ret;
-}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_internal.h b/KernelLand/Modules/Interfaces/UDI/udi_internal.h
new file mode 100644 (file)
index 0000000..3b49225
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ *
+ * udi_internal.h
+ * - Definitions for opaque structures
+ */
+#ifndef _UDI_INTERNAL_H_
+#define _UDI_INTERNAL_H_
+
+#define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
+#define NEW_wA(type,fld,cnt)   NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
+
+typedef struct sUDI_PropMessage        tUDI_PropMessage;
+typedef struct sUDI_PropRegion         tUDI_PropRegion;
+
+typedef struct sUDI_DriverModule       tUDI_DriverModule;
+typedef struct sUDI_DriverInstance     tUDI_DriverInstance;
+typedef struct sUDI_DriverRegion       tUDI_DriverRegion;
+
+struct sUDI_PropMessage
+{
+        int    locale;
+       udi_ubit16_t    index;
+       const char      *string;
+};
+
+struct sUDI_PropRegion
+{
+       enum {
+               UDI_REGIONTYPE_NORMAL,
+               UDI_REGIONTYPE_FP,
+       }       Type;
+       enum {
+               UDI_REGIONBINDING_STATIC,
+               UDI_REGIONBINDING_DYNAMIC,
+       }       Binding;
+       enum {
+               UDI_REGIONPRIO_MED,
+               UDI_REGIONPRIO_LO,
+               UDI_REGIONPRIO_HI,
+       }       Priority;
+       enum {
+               UDI_REGIONLATENCY_NONOVERRRUNABLE,
+               UDI_REGIONLATENCY_POWERFAIL,
+               UDI_REGIONLATENCY_OVERRUNNABLE,
+               UDI_REGIONLATENCY_RETRYABLE,
+               // non_overrunable
+               UDI_REGIONLATENCY_NONCTRITICAL,
+       }       Latency;
+       udi_ubit32_t    OverrunTime;
+
+
+};
+
+struct sUDI_DriverModule
+{
+       tUDI_DriverModule       *Next;
+       void    *Base;
+
+       udi_init_t      *InitInfo;
+               
+       const char      *ModuleName;
+        int    nMessages;
+       tUDI_PropMessage        *Messages;      // Sorted list
+       
+        int    nRegionTypes;
+       tUDI_PropRegion *RegionTypes;
+       
+        int    nSecondaryRegions;
+};
+
+struct sUDI_DriverInstance
+{
+       tUDI_DriverModule       *Module;
+       udi_channel_t   ManagementChannel;
+       tUDI_DriverRegion       *Regions[];
+};
+
+struct sUDI_DriverRegion
+{
+       udi_init_context_t      *InitContext;
+};
+
+enum eUDI_MetaLang
+{
+       METALANG_MGMT,
+       METALANG_BUS
+};
+
+extern udi_channel_t   UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
+       tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
+       tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex);
+
+extern const void      *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang);
+
+#endif
+
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/buf.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/buf.c
new file mode 100644 (file)
index 0000000..5327cc8
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * \file buf.c
+ * \author John Hodge (thePowersGang)
+ * 
+ * Buffer Manipulation
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_buf_copy);
+EXPORT(udi_buf_write);
+EXPORT(udi_buf_read);
+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
+       )
+{
+       UNIMPLEMENTED();
+}
+
+/**
+ * \brief Write to a buffer
+ * \param callback     Function to call once the write has completed
+ * \param gcb  Control Block
+ * \param src_mem      Source Data
+ * \param src_len      Length of source data
+ * \param dst_buf      Destination buffer
+ * \param dst_off      Destination offset in the buffer
+ * \param dst_len      Length of destination area (What the?, Redundant
+ *                     Department of redundacny department)
+ * \param path_handle  ???
+ */
+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
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_buf_read(
+       udi_buf_t       *src_buf,
+       udi_size_t      src_off,
+       udi_size_t      src_len,
+       void    *dst_mem )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_buf_free(udi_buf_t *buf)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/cb.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/cb.c
new file mode 100644 (file)
index 0000000..b615dfe
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * \file cb.c
+ * \author John Hodge (thePowersGang)
+ * \brief Control block code
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === CODE ===
+void udi_cb_alloc (
+       udi_cb_alloc_call_t     *callback,      //!< Function to be called when the CB is allocated
+       udi_cb_t        *gcb,   //!< Parent Control Block
+       udi_index_t     cb_idx,
+       udi_channel_t   default_channel
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_cb_alloc_dynamic(
+       udi_cb_alloc_call_t     *callback,
+       udi_cb_t        *gcb,
+       udi_index_t     cb_idx,
+       udi_channel_t   default_channel,
+       udi_size_t      inline_size,
+       udi_layout_t    *inline_layout
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_cb_alloc_batch(
+       udi_cb_alloc_batch_call_t       *callback,      //!< 
+       udi_cb_t        *gcb,   //!< 
+       udi_index_t     cb_idx,
+       udi_index_t     count,
+       udi_boolean_t   with_buf,
+       udi_size_t      buf_size,
+       udi_buf_path_t  path_handle
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_cb_free(udi_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
+{
+       UNIMPLEMENTED();
+}
+
+// === EXPORTS ===
+EXPORT(udi_cb_alloc);
+EXPORT(udi_cb_alloc_dynamic);
+EXPORT(udi_cb_alloc_batch);
+EXPORT(udi_cb_free);
+EXPORT(udi_cancel);
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c
new file mode 100644 (file)
index 0000000..cd15e07
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * \file imc.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_channel_anchor);
+EXPORT(udi_channel_spawn);
+EXPORT(udi_channel_set_context);
+EXPORT(udi_channel_op_abort);
+EXPORT(udi_channel_close);
+EXPORT(udi_channel_event_ind);
+EXPORT(udi_channel_event_complete);
+
+// === CODE ===
+/**
+ */
+void udi_channel_anchor(
+       udi_channel_anchor_call_t *callback, udi_cb_t *gcb,
+       udi_channel_t channel, udi_index_t ops_idx, void *channel_context
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+/**
+ */
+extern void udi_channel_spawn(
+       udi_channel_spawn_call_t *callback, udi_cb_t *gcb,
+       udi_channel_t channel, udi_index_t spawn_idx,
+       udi_index_t ops_idx, void *channel_context
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+/**
+ * 
+ */
+void udi_channel_set_context(
+       udi_channel_t target_channel, void *channel_context
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_op_abort(
+       udi_channel_t target_channel, udi_cb_t *orig_cb
+       )
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_close(udi_channel_t channel)
+{
+       Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_event_ind(udi_channel_event_cb_t *cb)
+{
+       udi_channel_event_complete(cb, UDI_OK);
+}
+
+void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status)
+{
+       Warning("%s Unimplemented", __func__);
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c
new file mode 100644 (file)
index 0000000..4d91c62
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * \file logging.c
+ * \author John Hodge (thePowersGang)
+ *
+ * \brief UDI Tracing, Logging and Debug
+ */
+#include <acess.h>
+#include <udi.h>
+
+void   __udi_assert(const char *expr, const char *file, int line);
+
+// === EXPORTS ===
+EXPORT(udi_trace_write);
+EXPORT(udi_log_write);
+EXPORT(__udi_assert);
+//EXPORT(udi_assert);
+EXPORT(udi_debug_break);
+EXPORT(udi_debug_printf);
+
+// === PROTOTYPES ===
+
+// === CODE ===
+void udi_trace_write(udi_init_context_t *init_context, udi_trevent_t trace_event, udi_index_t meta_idx, udi_ubit32_t msgnum, ...)
+{
+       ENTER("pinit_context itrace_event imeta_idx imsgnum",
+               init_context, trace_event, meta_idx, msgnum);
+//     const char *format = UDI_GetMessage(init_context, msgnum);
+//     LOG("format = \"%s\"", format);
+       LEAVE('-');
+}
+
+void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
+       udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx,
+       udi_status_t original_status, udi_ubit32_t msgnum, ... )
+{
+       Log("UDI Log");
+}
+
+void __udi_assert(const char *expr, const char *file, int line)
+{
+       Log("UDI Assertion failure: %s:%i - %s", file, line, expr);
+       UNIMPLEMENTED();
+}
+
+void udi_assert(udi_boolean_t bool)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_debug_break( udi_init_context_t *init_context, const char *message)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_debug_printf( const char *format, ... )
+{
+       va_list args;
+       va_start(args, format);
+       LogF("udi_debug_printf: ");
+       LogFV(format, args);
+       va_end(args);
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/mem.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/mem.c
new file mode 100644 (file)
index 0000000..a09d54c
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * \file mem.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_mem_alloc);
+EXPORT(udi_mem_free);
+
+// === 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);
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_gio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_gio.c
new file mode 100644 (file)
index 0000000..1618c27
--- /dev/null
@@ -0,0 +1,68 @@
+/**
+ * \file meta_gio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_gio_bind_req);
+EXPORT(udi_gio_bind_ack);
+EXPORT(udi_gio_unbind_req);
+EXPORT(udi_gio_unbind_ack);
+EXPORT(udi_gio_xfer_req);
+EXPORT(udi_gio_xfer_ack);
+EXPORT(udi_gio_xfer_nak);
+EXPORT(udi_gio_event_res);
+EXPORT(udi_gio_event_ind);
+EXPORT(udi_gio_event_res_unused);
+
+// === CODE ===
+void udi_gio_bind_req(udi_gio_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_bind_ack(
+       udi_gio_bind_cb_t       *cb,
+       udi_ubit32_t    device_size_lo,
+       udi_ubit32_t    device_size_hi,
+       udi_status_t    status
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_gio_unbind_req(udi_gio_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_gio_event_res(udi_gio_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_event_ind(udi_gio_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_gio_event_res_unused(udi_gio_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c
new file mode 100644 (file)
index 0000000..e34e3d9
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * \file meta_mgmt.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include "../udi_internal.h"
+
+// === EXPORTS ===
+EXPORT(udi_usage_ind);
+EXPORT(udi_static_usage);
+EXPORT(udi_usage_res);
+EXPORT(udi_enumerate_req);
+EXPORT(udi_enumerate_no_children);
+EXPORT(udi_enumerate_ack);
+EXPORT(udi_devmgmt_req);
+EXPORT(udi_devmgmt_ack);
+EXPORT(udi_final_cleanup_req);
+EXPORT(udi_final_cleanup_ack);
+
+// === CODE ===
+void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
+{
+       const udi_mgmt_ops_t *ops;
+       if( !(ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), METALANG_MGMT )) ) {
+               return ;
+       }
+       
+       ops->usage_ind_op(cb, resource_level);
+}
+
+void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_usage_res(udi_usage_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
+{      
+       ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
+       LEAVE('-');
+}
+
+void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
+{
+       ENTER("pcb xflags istatus", cb, flags, status);
+       LEAVE('-');
+}
+
+void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
+{
+       ENTER("pcb", cb);
+       LEAVE('-');
+}
+
+void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)
+{
+       ENTER("pcb", cb);
+       LEAVE('-');
+}
+
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c
new file mode 100644 (file)
index 0000000..5d136a1
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * \file physio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_dma_constraints_attr_set);
+EXPORT(udi_dma_constraints_attr_reset);
+EXPORT(udi_dma_constraints_free);
+
+// === CODE ===
+void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t src_constraints,
+       const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length,
+       udi_ubit8_t flags)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_constraints_attr_reset(
+       udi_dma_constraints_t   constraints,
+       udi_dma_constraints_attr_t      attr_type
+       )
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_constraints_free(udi_dma_constraints_t constraints)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c
new file mode 100644 (file)
index 0000000..1b1eecd
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * \file physio/dma.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_dma_prepare);
+EXPORT(udi_dma_buf_map);
+EXPORT(udi_dma_buf_unmap);
+EXPORT(udi_dma_mem_alloc);
+EXPORT(udi_dma_sync);
+EXPORT(udi_dma_scgth_sync);
+EXPORT(udi_dma_mem_barrier);
+EXPORT(udi_dma_free);
+EXPORT(udi_dma_mem_to_buf);
+
+// === CODE ===
+void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t constraints, udi_ubit8_t flags)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags)
+{
+       UNIMPLEMENTED();
+}
+
+udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size)
+{
+       UNIMPLEMENTED();
+       return NULL;
+}
+
+void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb,
+       udi_dma_constraints_t constraints, udi_ubit8_t flags,
+       udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_size_t offset, udi_size_t len, udi_ubit8_t flags)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_mem_barrier(udi_dma_handle_t dma_handle)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_free(udi_dma_handle_t dma_handle)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+       udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c
new file mode 100644 (file)
index 0000000..e1e6a47
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * \file physio/meta_bus.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_bus_unbind_req);
+EXPORT(udi_bus_unbind_ack);
+EXPORT(udi_bus_bind_req);
+EXPORT(udi_bus_bind_ack);
+
+// === CODE ===
+void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_bus_bind_ack(
+       udi_bus_bind_cb_t       *cb,
+       udi_dma_constraints_t   dma_constraints,
+       udi_ubit8_t     preferred_endianness,
+       udi_status_t    status
+       )
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c
new file mode 100644 (file)
index 0000000..0c0ef6c
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * \file physio/meta_intr.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_intr_attach_req);
+EXPORT(udi_intr_attach_ack);
+//EXPORT(udi_intr_attach_ack_unused);
+EXPORT(udi_intr_detach_req);
+EXPORT(udi_intr_detach_ack);
+//EXPORT(udi_intr_detach_ack_unused);
+EXPORT(udi_intr_event_ind);
+EXPORT(udi_intr_event_rdy);
+
+// === CODE ===
+void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
+{
+       UNIMPLEMENTED();
+}
+//void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
+//{
+//     UNIMPLEMENTED();
+//}
+
+void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
+{
+       UNIMPLEMENTED();
+}
+//void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
+//{
+//     UNIMPLEMENTED();
+//}
+
+void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_intr_event_rdy(udi_intr_event_cb_t *intr_event_cb)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c
new file mode 100644 (file)
index 0000000..03849ae
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * \file physio/pio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_pio_map);
+EXPORT(udi_pio_unmap);
+EXPORT(udi_pio_atmic_sizes);
+EXPORT(udi_pio_abort_sequence);
+EXPORT(udi_pio_trans);
+EXPORT(udi_pio_probe);
+
+// === CODE ===
+void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb,
+       udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length,
+       udi_pio_trans_t *trans_list, udi_ubit16_t list_length,
+       udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_pio_unmap(udi_pio_handle_t pio_handle)
+{
+       UNIMPLEMENTED();
+}
+
+udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle)
+{
+       UNIMPLEMENTED();
+       return 0;
+}
+
+void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb,
+       udi_pio_handle_t pio_handle, udi_index_t start_label,
+       udi_buf_t *buf, void *mem_ptr)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,
+       udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset,
+       udi_ubit8_t tran_size, udi_ubit8_t direction)
+{
+       UNIMPLEMENTED();
+}
+
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio_main.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio_main.c
new file mode 100644 (file)
index 0000000..f5e7aa0
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * \file logging.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <common.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === CODE ===
+void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
+{
+}
+
+void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
+{
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c
new file mode 100644 (file)
index 0000000..9e32fd7
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * \file queues.c
+ * \author John Hodge (thePowersGang)
+ *
+ * \brief UDI Queue Primatives
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_enqueue);
+EXPORT(udi_dequeue);
+
+// === CODE ===
+void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el)
+{
+       new_el->next = old_el->next;
+       new_el->prev = old_el;
+       old_el->next = new_el;
+       old_el->next->prev = new_el;
+}
+udi_queue_t *udi_dequeue(udi_queue_t *element)
+{
+       element->next->prev = element->prev;
+       element->prev->next = element->next;
+       return element;
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c
new file mode 100644 (file)
index 0000000..0e8a8ab
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_scsi.h>
+
+// === EXPORTS ===
+EXPORT(udi_scsi_bind_req);
+EXPORT(udi_scsi_bind_ack);
+EXPORT(udi_scsi_unbind_req);
+EXPORT(udi_scsi_unbind_ack);
+EXPORT(udi_scsi_io_req);
+EXPORT(udi_scsi_io_ack);
+EXPORT(udi_scsi_io_nak);
+EXPORT(udi_scsi_ctl_req);
+EXPORT(udi_scsi_ctl_ack);
+EXPORT(udi_scsi_event_ind);
+EXPORT(udi_scsi_event_ind_unused);
+EXPORT(udi_scsi_event_res);
+EXPORT(udi_scsi_inquiry_to_string);
+
+// === CODE ===
+void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb,
+       udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+       udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+
+void udi_scsi_io_req(udi_scsi_io_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_io_ack(udi_scsi_io_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_event_ind(udi_scsi_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_event_ind_unused(udi_scsi_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+       udi_scsi_event_res(cb);
+}
+void udi_scsi_event_res(udi_scsi_event_cb_t *cb)
+{
+       UNIMPLEMENTED();
+}
+void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str)
+{
+       UNIMPLEMENTED();
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c
new file mode 100644 (file)
index 0000000..870191d
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * \file strmem.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORTAS(strlen, udi_strlen);
+EXPORTAS(strcat, udi_strcat);
+EXPORTAS(strncat, udi_strncat);
+EXPORTAS(strcmp, udi_strcmp);
+EXPORTAS(strncmp, udi_strncmp);
+EXPORTAS(memcmp, udi_memcmp);
+EXPORTAS(strcpy, udi_strcpy);
+EXPORTAS(strncpy, udi_strncpy);
+EXPORTAS(memcpy, udi_memcpy);
+EXPORTAS(memmove, udi_memmove);
+EXPORT(udi_strncpy_rtrim);
+EXPORTAS(strchr, udi_strchr);
+EXPORTAS(strrchr, udi_strrchr);
+EXPORT(udi_memchr);
+EXPORTAS(memset, udi_memset);
+EXPORT(udi_strtou32);
+EXPORT(udi_snprintf);
+EXPORT(udi_vsnprintf);
+
+// === CODE ===
+char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n)
+{
+       char *dst = s1;
+       while( n-- )
+       {
+               *dst++ = *s2++;
+       }
+       while( dst > s1 && isspace(*--dst) )
+               ;
+       dst ++;
+       *dst = '\0';
+       return s1;
+}
+
+void *udi_memchr(const void *s, udi_ubit8_t c, udi_size_t n)
+{
+       const udi_ubit8_t *p = s;
+       while(n--)
+       {
+               if( *p == c )
+                       return (void*)p;
+               p ++;
+       }
+       return NULL;
+}
+
+udi_ubit32_t udi_strtou32(const char *s, char **endptr, int base)
+{
+       return strtoul(s, endptr, base);
+}
+
+udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...)
+{
+       udi_size_t      ret;
+       va_list args;
+       va_start(args, format);
+       
+       ret = udi_vsnprintf(s, max_bytes, format, args);
+       
+       va_end(args);
+       return ret;
+}
+udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap)
+{
+       // TODO: This should support some stuff Acess doesn't
+       return vsnprintf(s, max_bytes, format, ap);
+}
diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/time.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/time.c
new file mode 100644 (file)
index 0000000..3d82c14
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * \file time.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_timer_start);
+EXPORT(udi_timer_start_repeating);
+EXPORT(udi_timer_cancel);
+EXPORT(udi_time_current);
+EXPORT(udi_time_between);
+EXPORT(udi_time_since);
+
+// === CODE ===
+void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval)
+{
+       UNIMPLEMENTED();
+}
+void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval)
+{
+       UNIMPLEMENTED();
+}
+void udi_timer_cancel(udi_cb_t *gcb)
+{
+       UNIMPLEMENTED();
+}
+
+udi_timestamp_t        udi_time_current(void)
+{
+       return now();
+}
+udi_time_t udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time)
+{
+       udi_time_t      ret;
+       tTime   delta = end_time - start_time;
+       ret.seconds = delta / 1000;
+       ret.nanoseconds = (delta % 1000) * 1000 * 1000;
+       return ret;
+}
+udi_time_t udi_time_since(udi_timestamp_t start_time)
+{
+       return udi_time_between(start_time, udi_time_current());
+}

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