#
#
-CPPFLAGS = -I./include
+CPPFLAGS = -I../../../../UDI/include
# - UDI Library Files
LIB_OBJS := logging.o strmem.o imc.o mem.o buf.o cb.o
+++ /dev/null
-/*
- */
-#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
-
+++ /dev/null
-/*
- *
- */
-#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
+++ /dev/null
-/**
- * \file physio/meta_bus.h
- */
-#ifndef _PHYSIO_META_BUS_H_
-#define _PHYSIO_META_BUS_H_
-
-#include <udi.h>
-#include <udi_physio.h>
-
-typedef const struct udi_bus_device_ops_s udi_bus_device_ops_t;
-typedef const struct udi_bus_bridge_ops_s udi_bus_bridge_ops_t;
-typedef struct udi_bus_bind_cb_s udi_bus_bind_cb_t;
-typedef void udi_bus_unbind_req_op_t(udi_bus_bind_cb_t *cb);
-typedef void udi_bus_unbind_ack_op_t(udi_bus_bind_cb_t *cb);
-typedef void udi_bus_bind_req_op_t(udi_bus_bind_cb_t *cb);
-typedef void udi_bus_bind_ack_op_t(
- udi_bus_bind_cb_t *cb,
- udi_dma_constraints_t dma_constraints,
- udi_ubit8_t preferred_endianness,
- udi_status_t status
- );
-
-
-struct udi_bus_device_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_bus_bind_ack_op_t *bus_bind_ack_op;
- udi_bus_unbind_ack_op_t *bus_unbind_ack_op;
- udi_intr_attach_ack_op_t *intr_attach_ack_op;
- udi_intr_detach_ack_op_t *intr_detach_ack_op;
-};
-/* Bus Device Ops Vector Number */
-#define UDI_BUS_DEVICE_OPS_NUM 1
-
-struct udi_bus_bridge_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_bus_bind_req_op_t *bus_bind_req_op;
- udi_bus_unbind_req_op_t *bus_unbind_req_op;
- udi_intr_attach_req_op_t *intr_attach_req_op;
- udi_intr_detach_req_op_t *intr_detach_req_op;
-};
-/* Bus Bridge Ops Vector Number */
-#define UDI_BUS_BRIDGE_OPS_NUM 2
-
-struct udi_bus_bind_cb_s
-{
- udi_cb_t gcb;
-};
-/* Bus Bind Control Block Group Number */
-#define UDI_BUS_BIND_CB_NUM 1
-
-
-extern void udi_bus_bind_req(udi_bus_bind_cb_t *cb);
-
-extern 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
- );
-/* Values for preferred_endianness */
-#define UDI_DMA_BIG_ENDIAN (1U<<5)
-#define UDI_DMA_LITTLE_ENDIAN (1U<<6)
-#define UDI_DMA_ANY_ENDIAN (1U<<0)
-
-extern void udi_bus_unbind_req(udi_bus_bind_cb_t *cb);
-extern void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb);
-
-
-
-
-
-#endif
+++ /dev/null
-/**
- * \file physio/meta_intr.h
- */
-#ifndef _PHYSIO_META_INTR_H_
-#define _PHYSIO_META_INTR_H_
-
-#include <udi.h>
-#include <udi_physio.h>
-#include "pio.h"
-
-typedef struct udi_intr_attach_cb_s udi_intr_attach_cb_t;
-typedef void udi_intr_attach_req_op_t(udi_intr_attach_cb_t *intr_attach_cb);
-typedef void udi_intr_attach_ack_op_t(
- udi_intr_attach_cb_t *intr_attach_cb,
- udi_status_t status
- );
-typedef struct udi_intr_detach_cb_s udi_intr_detach_cb_t;
-typedef void udi_intr_detach_req_op_t(udi_intr_detach_cb_t *intr_detach_cb);
-typedef void udi_intr_detach_ack_op_t(udi_intr_detach_cb_t *intr_detach_cb);
-typedef const struct udi_intr_handler_ops_s udi_intr_handler_ops_t;
-typedef const struct udi_intr_dispatcher_ops_s udi_intr_dispatcher_ops_t;
-typedef struct udi_intr_event_cb_s udi_intr_event_cb_t;
-typedef void udi_intr_event_ind_op_t(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
-typedef void udi_intr_event_rdy_op_t(udi_intr_event_cb_t *intr_event_cb);
-
-
-struct udi_intr_attach_cb_s
-{
- udi_cb_t gcb;
- udi_index_t interrupt_idx;
- udi_ubit8_t min_event_pend;
- udi_pio_handle_t preprocessing_handle;
-};
-/* Bridge Attach Control Block Group Number */
-#define UDI_BUS_INTR_ATTACH_CB_NUM 2
-
-struct udi_intr_detach_cb_s
-{
- udi_cb_t gcb;
- udi_index_t interrupt_idx;
-};
-/* Bridge Detach Control Block Group Number */
-#define UDI_BUS_INTR_DETACH_CB_NUM 3
-
-struct udi_intr_handler_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_intr_event_ind_op_t *intr_event_ind_op;
-};
-/* Interrupt Handler Ops Vector Number */
-#define UDI_BUS_INTR_HANDLER_OPS_NUM 3
-
-struct udi_intr_dispatcher_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_intr_event_rdy_op_t *intr_event_rdy_op;
-};
-/* Interrupt Dispatcher Ops Vector Number */
-#define UDI_BUS_INTR_DISPATCH_OPS_NUM 4
-
-struct udi_intr_event_cb_s
-{
- udi_cb_t gcb;
- udi_buf_t *event_buf;
- udi_ubit16_t intr_result;
-};
-/* Flag values for interrupt handling */
-#define UDI_INTR_UNCLAIMED (1U<<0)
-#define UDI_INTR_NO_EVENT (1U<<1)
-/* Bus Interrupt Event Control Block Group Number */
-#define UDI_BUS_INTR_EVENT_CB_NUM 4
-
-
-
-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_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_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
-/**
- * \brief Values for ::udi_intr_event_ind \a flags
- * \{
- */
-#define UDI_INTR_MASKING_NOT_REQUIRED (1U<<0)
-#define UDI_INTR_OVERRUN_OCCURRED (1U<<1)
-#define UDI_INTR_PREPROCESSED (1U<<2)
-/**
- * \}
- */
-
-extern void udi_intr_event_rdy(udi_intr_event_cb_t *intr_event_cb);
-
-
-
-#endif
+++ /dev/null
-/*
- */
-#ifndef _UDI_PHYSIO_PCI_H_
-#define _UDI_PHYSIO_PCI_H_
-
-#define UDI_PCI_CONFIG_SPACE 255
-#define UDI_PCI_BAR_0 0
-#define UDI_PCI_BAR_1 1
-#define UDI_PCI_BAR_2 2
-#define UDI_PCI_BAR_3 3
-#define UDI_PCI_BAR_4 4
-#define UDI_PCI_BAR_5 5
-
-#endif
-
+++ /dev/null
-/**
- * \file physio/pio.h
- */
-#ifndef _PHYSIO_PIO_H_
-#define _PHYSIO_PIO_H_
-
-#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 Register numbers in pio_op
- */
-enum {
- UDI_PIO_R0,
- UDI_PIO_R1,
- UDI_PIO_R2,
- UDI_PIO_R3,
- UDI_PIO_R4,
- UDI_PIO_R5,
- UDI_PIO_R6,
- UDI_PIO_R7,
-};
-// Addressing modes
-#define UDI_PIO_DIRECT 0x00
-#define UDI_PIO_SCRATCH 0x08
-#define UDI_PIO_BUF 0x10
-#define UDI_PIO_MEM 0x18
-// Class A opcodes
-#define UDI_PIO_IN 0x00
-#define UDI_PIO_OUT 0x20
-#define UDI_PIO_LOAD 0x40
-#define UDI_PIO_STORE 0x60
-// Class B opcodes
-#define UDI_PIO_LOAD_IMM 0x80
-#define UDI_PIO_CSKIP 0x88
-#define UDI_PIO_IN_IND 0x90
-#define UDI_PIO_OUT_IND 0x98
-#define UDI_PIO_SHIFT_LEFT 0xA0
-#define UDI_PIO_SHIFT_RIGHT 0xA8
-#define UDI_PIO_AND 0xB0
-#define UDI_PIO_AND_IMM 0xB8
-#define UDI_PIO_OR 0xC0
-#define UDI_PIO_OR_IMM 0xC8
-#define UDI_PIO_XOR 0xD0
-#define UDI_PIO_ADD 0xD8
-#define UDI_PIO_ADD_IMM 0xE0
-#define UDI_PIO_SUB 0xE8
-// Class C opcodes
-#define UDI_PIO_BRANCH 0xF0
-#define UDI_PIO_LABEL 0xF1
-#define UDI_PIO_REP_IN_IND 0xF2
-#define UDI_PIO_REP_OUT_IND 0xF3
-#define UDI_PIO_DELAY 0xF4
-#define UDI_PIO_BARRIER 0xF5
-#define UDI_PIO_SYNC 0xF6
-#define UDI_PIO_SYNC_OUT 0xF7
-#define UDI_PIO_DEBUG 0xF8
-#define UDI_PIO_END 0xFE
-#define UDI_PIO_END_IMM 0xFF
-// Values for UDI_PIO_DEBUG's operand
-#define UDI_PIO_TRACE_OPS_NONE 0
-#define UDI_PIO_TRACE_OPS1 1
-#define UDI_PIO_TRACE_OPS2 2
-#define UDI_PIO_TRACE_OPS3 3
-#define UDI_PIO_TRACE_REGS_NONE (0U<<2)
-#define UDI_PIO_TRACE_REGS1 (1U<<2)
-#define UDI_PIO_TRACE_REGS2 (2U<<2)
-#define UDI_PIO_TRACE_REGS3 (3U<<2)
-#define UDI_PIO_TRACE_DEV_NONE (0U<<4)
-#define UDI_PIO_TRACE_DEV1 (1U<<4)
-#define UDI_PIO_TRACE_DEV2 (2U<<4)
-#define UDI_PIO_TRACE_DEV3 (3U<<4)
-// Values for conditional operations
-#define UDI_PIO_Z 0 // reg == 0
-#define UDI_PIO_NZ 1 // reg != 0
-#define UDI_PIO_NEG 2 // reg < 0 (signed)
-#define UDI_PIO_NNEG 3 // reg >= 0 (signed)
-
-#define UDI_PIO_REP_ARGS(mode,mem_reg,mem_stride,pio_reg,pio_stride,cnt_reg) \
- ((mode)|(mem_reg)|((mem_stride)<<5)|((pio_reg)<<7)|((pio_stride)<<10)|((cnt_reg)<<13))
-
-//! \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);
-
-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
+++ /dev/null
-/**
- * \file udi.h
- */
-#ifndef _UDI_H_
-#define _UDI_H_
-
-#include <stdint.h>
-#include <stdarg.h>
-
-typedef int8_t udi_sbit8_t; /* signed 8-bit: -2^7..2^7-1 */
-typedef int16_t udi_sbit16_t; /* signed 16-bit: -2^15..2^15-1 */
-typedef int32_t udi_sbit32_t; /* signed 32-bit: -2^31..2^31-1 */
-typedef uint8_t udi_ubit8_t; /* unsigned 8-bit: 0..28-1 */
-typedef uint16_t udi_ubit16_t; /* unsigned 16-bit: 0..216-1 */
-typedef uint32_t udi_ubit32_t; /* unsigned 32-bit: 0..232-1 */
-
-#ifndef NULL
-# define NULL ((void*)0)
-#endif
-
-#if UDI_ABI_is_ia32
-#include "udi/arch/x86.h"
-#else
-#error "Unknown UDI ABI"
-#endif
-
-/**
- * \name Values and Flags for udi_status_t
- * \{
- */
-#define UDI_STATUS_CODE_MASK 0x0000FFFF
-#define UDI_STAT_META_SPECIFIC 0x00008000
-#define UDI_SPECIFIC_STATUS_MASK 0x00007FFF
-#define UDI_CORRELATE_OFFSET 16
-#define UDI_CORRELATE_MASK 0xFFFF0000
-/* Common Status Values */
-#define UDI_OK 0
-#define UDI_STAT_NOT_SUPPORTED 1
-#define UDI_STAT_NOT_UNDERSTOOD 2
-#define UDI_STAT_INVALID_STATE 3
-#define UDI_STAT_MISTAKEN_IDENTITY 4
-#define UDI_STAT_ABORTED 5
-#define UDI_STAT_TIMEOUT 6
-#define UDI_STAT_BUSY 7
-#define UDI_STAT_RESOURCE_UNAVAIL 8
-#define UDI_STAT_HW_PROBLEM 9
-#define UDI_STAT_NOT_RESPONDING 10
-#define UDI_STAT_DATA_UNDERRUN 11
-#define UDI_STAT_DATA_OVERRUN 12
-#define UDI_STAT_DATA_ERROR 13
-#define UDI_STAT_PARENT_DRV_ERROR 14
-#define UDI_STAT_CANNOT_BIND 15
-#define UDI_STAT_CANNOT_BIND_EXCL 16
-#define UDI_STAT_TOO_MANY_PARENTS 17
-#define UDI_STAT_BAD_PARENT_TYPE 18
-#define UDI_STAT_TERMINATED 19
-#define UDI_STAT_ATTR_MISMATCH 20
-/**
- * \}
- */
-
-/**
- * \name Data Layout Specifiers
- * \{
- */
-typedef const udi_ubit8_t udi_layout_t;
-/* Specific-Length Layout Type Codes */
-#define UDI_DL_UBIT8_T 1
-#define UDI_DL_SBIT8_T 2
-#define UDI_DL_UBIT16_T 3
-#define UDI_DL_SBIT16_T 4
-#define UDI_DL_UBIT32_T 5
-#define UDI_DL_SBIT32_T 6
-#define UDI_DL_BOOLEAN_T 7
-#define UDI_DL_STATUS_T 8
-/* Abstract Element Layout Type Codes */
-#define UDI_DL_INDEX_T 20
-/* Opaque Handle Element Layout Type Codes */
-#define UDI_DL_CHANNEL_T 30
-#define UDI_DL_ORIGIN_T 32
-/* Indirect Element Layout Type Codes */
-#define UDI_DL_BUF 40
-#define UDI_DL_CB 41
-#define UDI_DL_INLINE_UNTYPED 42
-#define UDI_DL_INLINE_DRIVER_TYPED 43
-#define UDI_DL_MOVABLE_UNTYPED 44
-/* Nested Element Layout Type Codes */
-#define UDI_DL_INLINE_TYPED 50
-#define UDI_DL_MOVABLE_TYPED 51
-#define UDI_DL_ARRAY 52
-#define UDI_DL_END 0
-/**
- * \}
- */
-
-
-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
-#include "udi/meta_mgmt.h" // Management Metalanguage
-#include "udi/meta_gio.h" // General IO Metalanguage
-#include "udi/init.h" // Init
-
-#endif
+++ /dev/null
-
-#ifndef _UDI_ARCH_x86_H_
-#define _UDI_ARCH_x86_H_
-
-typedef udi_ubit8_t udi_boolean_t; /* 0=False; 1..28-1=True */
-#define FALSE 0
-#define TRUE 1
-
-typedef uint32_t udi_size_t; /* buffer size */
-typedef udi_ubit8_t udi_index_t; /* zero-based index type */
-
-typedef void *_udi_handle_t;
-#define _NULL_HANDLE ((void*)0)
-
-/* Channel Handle */
-typedef _udi_handle_t *udi_channel_t;
-#define UDI_NULL_CHANNEL _NULL_HANDLE
-
-/**
- * \brief Buffer Path
- */
-typedef _udi_handle_t udi_buf_path_t;
-#define UDI_NULL_BUF_PATH _NULL_HANDLE
-
-typedef _udi_handle_t udi_origin_t;
-#define UDI_NULL_ORIGIN _NULL_HANDLE
-
-typedef int64_t udi_timestamp_t;
-
-#define UDI_HANDLE_IS_NULL(handle, handle_type) (handle == NULL)
-#define UDI_HANDLE_ID(handle, handle_type) ((uint32_t)handle)
-
-/**
- * \name va_arg wrapper
- * \{
- */
-#define UDI_VA_ARG(pvar, type, va_code) va_arg(pvar,type)
-#define UDI_VA_UBIT8_T
-#define UDI_VA_SBIT8_T
-#define UDI_VA_UBIT16_T
-#define UDI_VA_SBIT16_T
-#define UDI_VA_UBIT32_T
-#define UDI_VA_SBIT32_T
-#define UDI_VA_BOOLEAN_T
-#define UDI_VA_INDEX_T
-#define UDI_VA_SIZE_T
-#define UDI_VA_STATUS_T
-#define UDI_VA_CHANNEL_T
-#define UDI_VA_ORIGIN_T
-#define UDI_VA_POINTER
-/**
- * \}
- */
-
-/**
- * \brief Status Type
- */
-typedef udi_ubit32_t udi_status_t;
-
-#endif
+++ /dev/null
-/**
- * \file udi_attr.h
- */
-#ifndef _UDI_ATTR_H_
-#define _UDI_ATTR_H_
-
-typedef struct udi_instance_attr_list_s udi_instance_attr_list_t;
-typedef udi_ubit8_t udi_instance_attr_type_t;
-
-/* Instance attribute limits */
-#define UDI_MAX_ATTR_NAMELEN 32
-#define UDI_MAX_ATTR_SIZE 64
-
-#define UDI_ATTR32_SET(aval, v) \
- { udi_ubit32_t vtmp = (v); \
- (aval)[0] = (vtmp) & 0xff; \
- (aval)[1] = ((vtmp) >> 8) & 0xff; \
- (aval)[2] = ((vtmp) >> 16) & 0xff; \
- (aval)[3] = ((vtmp) >> 24) & 0xff; }
-#define UDI_ATTR32_GET(aval) \
- ((aval)[0] + ((aval)[1] << 8) + \
- ((aval)[2] << 16) + ((aval)[3] << 24))
-#define UDI_ATTR32_INIT(v) \
- { (v) & 0xff, ((v) >> 8) & 0xff, \
- ((v) >> 16) & 0xff, ((v) >> 24) & 0xff }
-
-/**
- * \brief Instance Attribute
- */
-struct udi_instance_attr_list_s
-{
- char attr_name[UDI_MAX_ATTR_NAMELEN];
- udi_ubit8_t attr_value[UDI_MAX_ATTR_SIZE];
- udi_ubit8_t attr_length;
- udi_instance_attr_type_t attr_type;
-};
-
-
-/**
- * \brief Instance Attribute Types
- * \see ::udi_instance_attr_type_t
- */
-enum
-{
- UDI_ATTR_NONE,
- UDI_ATTR_STRING,
- UDI_ATTR_ARRAY8,
- UDI_ATTR_UBIT32,
- UDI_ATTR_BOOLEAN,
- UDI_ATTR_FILE
-};
-
-
-#endif
+++ /dev/null
-/**
- * \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;
- udi_ubit8_t 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
+++ /dev/null
-/**
- * \file udi_cb.h
- */
-#ifndef _UDI_CB_H_
-#define _UDI_CB_H_
-
-typedef struct udi_cb_s udi_cb_t;
-typedef void udi_cb_alloc_call_t(udi_cb_t *gcb, udi_cb_t *new_cb);
-typedef void udi_cb_alloc_batch_call_t(udi_cb_t *gcb, udi_cb_t *first_new_cb);
-typedef void udi_cancel_call_t(udi_cb_t *gcb);
-
-#define UDI_GCB(mcb) (&(mcb)->gcb)
-#define UDI_MCB(gcb, cb_type) ((cb_type *)(gcb))
-
-/**
- * \brief Describes a generic control block
- * \note Semi-opaque
- */
-struct udi_cb_s
-{
- /**
- * \brief Channel associated with the control block
- */
- udi_channel_t channel;
- /**
- * \brief Current state
- * \note Driver changable
- */
- void *context;
- /**
- * \brief CB's scratch area
- */
- void *scratch;
- /**
- * \brief Source-usable value
- */
- void *initiator_context;
- /**
- * \brief Request Handle?
- */
- udi_origin_t origin;
-};
-
-extern void udi_cb_alloc (
- udi_cb_alloc_call_t *callback,
- udi_cb_t *gcb,
- udi_index_t cb_idx,
- udi_channel_t default_channel
- );
-
-extern 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
- );
-
-extern 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
- );
-
-extern void udi_cb_free(udi_cb_t *cb);
-
-extern void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb);
-
-
-
-
-#endif
+++ /dev/null
-/**
- * \file udi_imc.h
- * \brief Inter-Module Communication
- */
-#ifndef _UDI_IMC_H_
-#define _UDI_IMC_H_
-
-typedef void udi_channel_anchor_call_t(udi_cb_t *gcb, udi_channel_t anchored_channel);
-typedef void udi_channel_spawn_call_t(udi_cb_t *gcb, udi_channel_t new_channel);
-
-typedef struct udi_channel_event_cb_s udi_channel_event_cb_t;
-
-typedef void udi_channel_event_ind_op_t(udi_channel_event_cb_t *cb);
-
-/**
- * \brief Anchors a channel end to the current region
- */
-extern 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
- );
-
-/**
- * \brief Created a new channel between two regions
- */
-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
- );
-
-/**
- * \brief Attaches a new context pointer to the current channel
- */
-extern void udi_channel_set_context(
- udi_channel_t target_channel,
- void *channel_context
- );
-/**
- * \brief
- */
-extern void udi_channel_op_abort(
- udi_channel_t target_channel,
- udi_cb_t *orig_cb
- );
-
-/**
- * \brief Closes an open channel
- */
-extern void udi_channel_close(udi_channel_t channel);
-
-/**
- * \brief Describes a channel event
- */
-struct udi_channel_event_cb_s
-{
- udi_cb_t gcb;
- udi_ubit8_t event;
- union {
- struct {
- udi_cb_t *bind_cb;
- } internal_bound;
- struct {
- udi_cb_t *bind_cb;
- udi_ubit8_t parent_ID;
- udi_buf_path_t *path_handles;
- } parent_bound;
- udi_cb_t *orig_cb;
- } params;
-};
-/* Channel event types */
-#define UDI_CHANNEL_CLOSED 0
-#define UDI_CHANNEL_BOUND 1
-#define UDI_CHANNEL_OP_ABORTED 2
-
-/**
- * \brief Proxy function
- */
-extern void udi_channel_event_ind(udi_channel_event_cb_t *cb);
-
-/**
- * \brief Called when channel event is completed
- */
-extern void udi_channel_event_complete(
- udi_channel_event_cb_t *cb, udi_status_t status
- );
-
-
-#endif
+++ /dev/null
-/**
- * \file udi_init.h
- */
-#ifndef _UDI_INIT_H_
-#define _UDI_INIT_H_
-
-/**
- * \brief UDI Initialisation Structure
- *
- * Defines how to initialise and use a UDI driver
- */
-struct udi_init_s
-{
- /**
- * \brief Defines the primary region
- * \note For secondary modules this must be NULL
- */
- udi_primary_init_t *primary_init_info;
-
- /**
- * \brief Defines all secondary regions
- * Pointer to a list (so, essentially an array) of ::udi_secondary_init_t
- * It is terminated by an entry with ::udi_secondary_init_t.region_idx
- * set to zero.
- * \note If NULL, it is to be treated as an empty list
- */
- udi_secondary_init_t *secondary_init_list;
-
- /**
- * \brief Channel operations
- * Pointer to a ::udi_ops_init_t.ops_idx == 0 terminated list that
- * defines the channel opterations usage for each ops vector implemented
- * in this module.
- * \note Must contain at least one entry for each metalanguage used
- */
- udi_ops_init_t *ops_init_list;
-
- /**
- * \brief Control Blocks
- */
- udi_cb_init_t *cb_init_list;
-
- /**
- * \brief Generic Control Blocks
- */
- udi_gcb_init_t *gcb_init_list;
-
- /**
- * \brief Overrides for control blocks
- * Allows a control block to override the ammount of scratch space it
- * gets for a specific ops vector.
- */
- udi_cb_select_t *cb_select_list;
-} __attribute__((packed));
-
-
-/**
- * \name Flags for ::udi_primary_init_t.mgmt_op_flags
- * \{
- */
-
-/**
- * \brief Tells the environment that this operation may take some time
- * Used as a hint in scheduling tasks
- */
-#define UDI_OP_LONG_EXEC 0x01
-
-/**
- * \}
- */
-
-/**
- * \brief Describes the Primary Region
- * Tells the environment how to set up the driver's primary region.
- */
-struct udi_primary_init_s
-{
- /**
- * \brief Management Ops Vector
- * Pointer to a list of functions for the Management Metalanguage
- */
- udi_mgmt_ops_t *mgmt_ops;
-
- /**
- * \brief Flags for \a mgmt_ops
- * Each entry in \a mgmt_ops is acommanied by an entry in this array.
- * Each entry contains the flags that apply to the specified ops vector.
- * \see UDI_OP_LONG_EXEC
- */
- const udi_ubit8_t *mgmt_op_flags;
-
- /**
- * \brief Scratch space size
- * Specifies the number of bytes to allocate for each control block
- * passed by the environment.
- * \note must not exceed ::UDI_MAX_SCRATCH
- */
- udi_size_t mgmt_scratch_requirement;
-
- /**
- * \todo What is this?
- */
- udi_ubit8_t enumeration_attr_list_length;
-
- /**
- * \brief Size in bytes to allocate to each instance of the primary
- * region
- * Essentially the size of the driver's instance state
- * \note Must be at least sizeof(udi_init_context_t) and not more
- * than UDI_MIN_ALLOC_LIMIT
- */
- udi_size_t rdata_size;
-
- /**
- * \brief Size in bytes to allocate for each call to ::udi_enumerate_req
- * \note Must not exceed UDI_MIN_ALLOC_LIMIT
- */
- udi_size_t child_data_size;
-
- /**
- * \brief Number of path handles for each parent bound to this driver
- * \todo What the hell are path handles?
- */
- udi_ubit8_t per_parent_paths;
-};
-
-/**
- * \brief Tells the environment how to create a secondary region
- */
-struct udi_secondary_init_s
-{
- /**
- * \brief Region Index
- * Non-zero driver-dependent index value that identifies the region
- * \note This corresponds to a "region" declaration in the udiprops.txt
- * file.
- */
- udi_index_t region_idx;
- /**
- * \brief Number of bytes to allocate
- *
- * \note Again, must be between sizeof(udi_init_context_t) and
- * UDI_MIN_ALLOC_LIMIT
- */
- udi_size_t rdata_size;
-};
-
-/**
- * \brief Defines channel endpoints (ways of communicating with the driver)
- *
- */
-struct udi_ops_init_s
-{
- /**
- * \brief ops index number
- * Used to uniquely this entry
- * \note If this is zero, it marks the end of the list
- */
- udi_index_t ops_idx;
- /**
- * \brief Metalanguage Index
- * Defines what metalanguage is used
- */
- udi_index_t meta_idx;
- /**
- * \brief Metalanguage Operation
- * Defines what metalanguage operation is used
- */
- udi_index_t meta_ops_num;
- /**
- * \brief Size of the context area
- * \note If non-zero, must be at least
- */
- udi_size_t chan_context_size;
- /**
- * \brief Pointer to the operations
- * Pointer to a <<meta>>_<<role>>_ops_t structure
- */
- udi_ops_vector_t *ops_vector;
- /**
- * \brief Flags for each entry in \a ops_vector
- */
- const udi_ubit8_t *op_flags;
-};
-
-/**
- * \brief Defines control blocks
- * Much the same as ::udi_ops_init_t
- */
-struct udi_cb_init_s
-{
- udi_index_t cb_idx;
- udi_index_t meta_idx;
- udi_index_t meta_cb_num;
- udi_size_t scratch_requirement;
- /**
- * \brief Size of inline memory
- */
- udi_size_t inline_size;
- /**
- * \brief Layout of inline memory
- */
- udi_layout_t *inline_layout;
-};
-
-/**
- * \brief Overrides the scratch size for an operation
- */
-struct udi_cb_select_s
-{
- udi_index_t ops_idx;
- udi_index_t cb_idx;
-};
-
-/**
- * \brief General Control Blocks
- * These control blocks can only be used as general data storage, not
- * for any channel operations.
- */
-struct udi_gcb_init_s
-{
- udi_index_t cb_idx;
- udi_size_t scratch_requirement;
-};
-
-
-// ===
-// ===
-/**
- * \brief Environement Imposed Limits
- */
-struct udi_limits_s
-{
- /**
- * \brief Maximum legal ammount of memory that can be allocated
- */
- udi_size_t max_legal_alloc;
-
- /**
- * \brief Maximum ammount of guaranteed memory
- */
- udi_size_t max_safe_alloc;
- /**
- * \brief Maximum size of the final string from ::udi_trace_write
- * or ::udi_log_write
- */
- udi_size_t max_trace_log_formatted_len;
- /**
- * \brief Maximum legal size of an instanct attribute value
- */
- udi_size_t max_instance_attr_len;
- /**
- * \brief Minumum time difference (in nanoseconds between unique values
- * returned by ::udi_time_current
- */
- udi_ubit32_t min_curtime_res;
- /**
- * \brief Minimum resolution of timers
- * \see ::udi_timer_start_repeating, ::udi_timer_start
- */
- udi_ubit32_t min_timer_res;
-} __attribute__((packed));
-
-/**
- * \brief Primary Region Context data
- */
-struct udi_init_context_s
-{
- udi_index_t region_idx;
- udi_limits_t limits;
-};
-
-/**
- * \brief Channel context data
- */
-struct udi_chan_context_s
-{
- /**
- * \brief Pointer to the driver instance's initial region data
- */
- void *rdata;
-} __attribute__((packed));
-
-/**
- * \brief Child Channel context
- */
-struct udi_child_chan_context_s
-{
- /**
- * \brief Pointer to the driver instance's initial region data
- */
- void *rdata;
- /**
- * \brief Some sort of unique ID number
- */
- udi_ubit32_t child_ID;
-};
-
-#endif
+++ /dev/null
-/**
- * \file udi_log.h
- */
-#ifndef _UDI_LOG_H_
-#define _UDI_LOG_H_
-
-/**
- * \brief Trace Event
- */
-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
- */
-typedef void udi_log_write_call_t(udi_cb_t *gcb, udi_status_t correlated_status);
-
-/**
- * \name Log Severities
- * \brief Values for severity
- * \{
- */
-#define UDI_LOG_DISASTER 1
-#define UDI_LOG_ERROR 2
-#define UDI_LOG_WARNING 3
-#define UDI_LOG_INFORMATION 4
-/**
- * \}
- */
-
-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
+++ /dev/null
-/*
- * Acess2 UDI Layer
- * - By John Hodge (thePowersGang)
- *
- * include/udi/mei.h
- * - Metalanguage-to-Environment Interface
- */
-#ifndef _UDI__MEI_H_
-#define _UDI__MEI_H_
-
-typedef const struct udi_mei_init_s udi_mei_init_t;
-typedef const struct udi_mei_ops_vec_template_s udi_mei_ops_vec_template_t;
-typedef const struct uid_mei_op_template_s uid_mei_op_template_t;
-
-typedef udi_ubit8_t udi_mei_enumeration_rank_func_t(udi_ubit32_t attr_device_match, void **attr_value_list);
-typedef void udi_mei_direct_stub_t(udi_op_t *op, udi_cb_t *gcb, va_list arglist);
-typedef void udi_mei_backend_stub_t(udi_op_t *op, udi_cb_t *gcb, void *marshal_space);
-
-struct udi_mei_init_s
-{
- udi_mei_ops_vec_template_t *ops_vec_template_list;
- udi_mei_enumeration_rank_func_t *mei_enumeration_rank;
-};
-
-struct udi_mei_ops_vec_template_s
-{
- udi_index_t meta_ops_num;
- udi_ubit8_t relationship;
- const udi_mei_op_template_t *op_template_list;
-};
-// Flags for `relationship`
-#define UDI_MEI_REL_INITIATOR (1U<<0)
-#define UDI_MEI_REL_BIND (1U<<1)
-#define UDI_MEI_REL_EXTERNAL (1U<<2)
-#define UDI_MEI_REL_INTERNAL (1U<<3)
-#define UDI_MEI_REL_SINGLE (1U<<4)
-
-struct uid_mei_op_template_s
-{
- const char *op_name;
- udi_ubit8_t op_category;
- udi_ubit8_t op_flags;
- udi_index_t meta_cb_num;
- udi_index_t completion_ops_num;
- udi_index_t completion_vec_idx;
- udi_index_t exception_ops_num;
- udi_index_t exception_vec_idx;
- udi_mei_direct_stub_t *direct_stub;
- udi_mei_backend_stub_t *backend_stub;
- udi_layout_t *visible_layout;
- udi_layout_t *marshal_layout;
-};
-/* Values for op_category */
-#define UDI_MEI_OPCAT_REQ 1
-#define UDI_MEI_OPCAT_ACK 2
-#define UDI_MEI_OPCAT_NAK 3
-#define UDI_MEI_OPCAT_IND 4
-#define UDI_MEI_OPCAT_RES 5
-#define UDI_MEI_OPCAT_RDY 6
-/* Values for op_flags */
-#define UDI_MEI_OP_ABORTABLE (1U<<0)
-#define UDI_MEI_OP_RECOVERABLE (1U<<1)
-#define UDI_MEI_OP_STATE_CHANGE (1U<<2)
-/* Maximum Sizes For Control Block Layouts */
-#define UDI_MEI_MAX_VISIBLE_SIZE 2000
-#define UDI_MEI_MAX_MARSHAL_SIZE 4000
-
-#define _UDI_MEI_FIRST(lst, ...) lst
-#define _UDI_MEI_OTHER(lst, ...) __VA_ARGS__
-#define _UDI_MEI_VARG(type,name,vatype) \
- type name = UDI_VA_ARG(arglist, type, vatype);
-#define _UDI_MEI_VARGS0()
-#define _UDI_MEI_VARGS1(args,argt,argva) \
- _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva))
-#define _UDI_MEI_VARGS2(args,argt,argva) \
- _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva)) \
- _UDI_MEI_VARGS1( _UDI_MEI_OTHER(argt), _UDI_MEI_OTHER(args), _UDI_MEI_OTHER(argva) )
-
-#define UDI_MEI_STUBS(op_name, cb_type, argc, args, arg_types, arg_va_list, meta_ops_num, vec_idx) \
- void op_name(cb_type *cb, _UDI_ARG_LIST_##argc args ) {\
- udi_mei_call(UDI_GCB(cb), &udi_mei_info, meta_ops_num, vec_idx, args);\
- }\
- void op_name##_direct(udi_op_t *op, udi_cb_t *gcb, va_lis arglist) {\
- _UDI_MEI_VARGS##argc(args ,## arg_types ,## arg_va_list)\
- (*(op_name##_op_t)op)(UDI_MCB(gcb, cb_type) ,## args);\
- }\
- void op_name##_backend(udi_op_t *op, udi_cb_t *gcb, void *marshal_space) {\
- }
-
-#endif
-
+++ /dev/null
-/**
- * \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
+++ /dev/null
-/**
- * \file udi_meta_gio.h
- */
-#ifndef _UDI_META_GIO_H_
-#define _UDI_META_GIO_H_
-
-typedef const struct udi_gio_provider_ops_s udi_gio_provider_ops_t;
-typedef const struct udi_gio_client_ops_s udi_gio_client_ops_t;
-typedef struct udi_gio_bind_cb_s udi_gio_bind_cb_t;
-typedef struct udi_gio_xfer_cb_s udi_gio_xfer_cb_t;
-typedef struct udi_gio_rw_params_s udi_gio_rw_params_t;
-typedef struct udi_gio_event_cb_s udi_gio_event_cb_t;
-
-typedef void udi_gio_bind_req_op_t(udi_gio_bind_cb_t *cb);
-typedef void udi_gio_unbind_req_op_t(udi_gio_bind_cb_t *cb);
-typedef void udi_gio_xfer_req_op_t(udi_gio_bind_cb_t *cb);
-typedef void udi_gio_event_res_op_t(udi_gio_bind_cb_t *cb);
-
-typedef void udi_gio_bind_ack_op_t(
- udi_gio_bind_cb_t *cb,
- udi_ubit32_t device_size_lo,
- udi_ubit32_t device_size_hi,
- udi_status_t status
- );
-typedef void udi_gio_unbind_ack_op_t(udi_gio_bind_cb_t *cb);
-typedef void udi_gio_xfer_ack_op_t(udi_gio_bind_cb_t *cb);
-typedef void udi_gio_xfer_nak_op_t(udi_gio_bind_cb_t *cb, udi_status_t status);
-typedef void udi_gio_event_ind_op_t(udi_gio_bind_cb_t *cb);
-
-typedef udi_ubit8_t udi_gio_op_t;
-/* Limit values for udi_gio_op_t */
-#define UDI_GIO_OP_CUSTOM 16
-#define UDI_GIO_OP_MAX 64
-/* Direction flag values for op */
-#define UDI_GIO_DIR_READ (1U<<6)
-#define UDI_GIO_DIR_WRITE (1U<<7)
-/* Standard Operation Codes */
-#define UDI_GIO_OP_READ UDI_GIO_DIR_READ
-#define UDI_GIO_OP_WRITE UDI_GIO_DIR_WRITE
-
-
-
-struct udi_gio_provider_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_gio_bind_req_op_t *gio_bind_req_op;
- udi_gio_unbind_req_op_t *gio_unbind_req_op;
- udi_gio_xfer_req_op_t *gio_xfer_req_op;
- udi_gio_event_res_op_t *gio_event_res_op;
-};
-/* Ops Vector Number */
-#define UDI_GIO_PROVIDER_OPS_NUM 1
-
-struct udi_gio_client_ops_s
-{
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_gio_bind_ack_op_t *gio_bind_ack_op;
- udi_gio_unbind_ack_op_t *gio_unbind_ack_op;
- udi_gio_xfer_ack_op_t *gio_xfer_ack_op;
- udi_gio_xfer_nak_op_t *gio_xfer_nak_op;
- udi_gio_event_ind_op_t *gio_event_ind_op;
-};
-/* Ops Vector Number */
-#define UDI_GIO_CLIENT_OPS_NUM 2
-
-struct udi_gio_bind_cb_s
-{
- udi_cb_t gcb;
- udi_xfer_constraints_t xfer_constraints;
-};
-/* Control Block Group Number */
-#define UDI_GIO_BIND_CB_NUM 1
-
-
-struct udi_gio_xfer_cb_s
-{
- udi_cb_t gcb;
- udi_gio_op_t op;
- void *tr_params;
- udi_buf_t *data_buf;
-};
-/* Control Block Group Number */
-#define UDI_GIO_XFER_CB_NUM 2
-
-struct udi_gio_rw_params_s
-{
- udi_ubit32_t offset_lo;
- udi_ubit32_t offset_hi;
-};
-
-struct udi_gio_event_cb_s
-{
- udi_cb_t gcb;
- udi_ubit8_t event_code;
- void *event_params;
-};
-/* Control Block Group Number */
-#define UDI_GIO_EVENT_CB_NUM 3
-
-
-extern void udi_gio_bind_req(udi_gio_bind_cb_t *cb);
-extern 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
- );
-
-extern void udi_gio_unbind_req(udi_gio_bind_cb_t *cb);
-extern void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb);
-
-extern void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb);
-extern void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb);
-extern void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status);
-
-extern void udi_gio_event_res(udi_gio_event_cb_t *cb);
-extern void udi_gio_event_ind(udi_gio_event_cb_t *cb);
-extern void udi_gio_event_res_unused(udi_gio_event_cb_t *cb);
-
-#endif
+++ /dev/null
-/**
- * \file udi_meta_mgmt.h
- */
-#ifndef _UDI_META_MGMT_H_
-#define _UDI_META_MGMT_H_
-
-typedef struct udi_mgmt_ops_s udi_mgmt_ops_t;
-typedef struct udi_mgmt_cb_s udi_mgmt_cb_t;
-typedef struct udi_usage_cb_s udi_usage_cb_t;
-typedef struct udi_filter_element_s udi_filter_element_t;
-typedef struct udi_enumerate_cb_s udi_enumerate_cb_t;
-
-/**
- * \name Specify Usage
- * \{
- */
-typedef void udi_usage_ind_op_t(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
-/* Values for resource_level */
-#define UDI_RESOURCES_CRITICAL 1
-#define UDI_RESOURCES_LOW 2
-#define UDI_RESOURCES_NORMAL 3
-#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
-#define UDI_ENUMERATE_NEXT 3
-#define UDI_ENUMERATE_NEW 4
-#define UDI_ENUMERATE_DIRECTED 5
-#define UDI_ENUMERATE_RELEASE 6
-/* Proxy */
-extern void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
-/**
- * \}
- */
-
-/**
- * \name Enumeration Acknowlagement
- * \{
- */
-typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx);
-/* Values for enumeration_result */
-#define UDI_ENUMERATE_OK 0
-#define UDI_ENUMERATE_LEAF 1
-#define UDI_ENUMERATE_DONE 2
-#define UDI_ENUMERATE_RESCAN 3
-#define UDI_ENUMERATE_REMOVED 4
-#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);
-/**
- * \}
- */
-
-/**
- * \name
- * \{
- */
-typedef void udi_devmgmt_req_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID);
-
-typedef void udi_devmgmt_ack_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
-/**
- * \}
- */
-typedef void udi_final_cleanup_req_op_t(udi_mgmt_cb_t *cb);
-typedef void udi_final_cleanup_ack_op_t(udi_mgmt_cb_t *cb);
-
-
-
-
-
-struct udi_mgmt_ops_s
-{
- udi_usage_ind_op_t *usage_ind_op;
- udi_enumerate_req_op_t *enumerate_req_op;
- udi_devmgmt_req_op_t *devmgmt_req_op;
- udi_final_cleanup_req_op_t *final_cleanup_req_op;
-};
-
-struct udi_mgmt_cb_s
-{
- udi_cb_t gcb;
-};
-
-struct udi_usage_cb_s
-{
- udi_cb_t gcb;
- udi_trevent_t trace_mask;
- udi_index_t meta_idx;
-};
-
-
-struct udi_filter_element_s
-{
- char attr_name[UDI_MAX_ATTR_NAMELEN];
- udi_ubit8_t attr_min[UDI_MAX_ATTR_SIZE];
- udi_ubit8_t attr_min_len;
- udi_ubit8_t attr_max[UDI_MAX_ATTR_SIZE];
- udi_ubit8_t attr_max_len;
- udi_instance_attr_type_t attr_type;
- udi_ubit32_t attr_stride;
-};
-struct udi_enumerate_cb_s
-{
- udi_cb_t gcb;
- udi_ubit32_t child_ID;
- void *child_data;
- udi_instance_attr_list_t *attr_list;
- udi_ubit8_t attr_valid_length;
- const udi_filter_element_t *filter_list;
- udi_ubit8_t filter_list_length;
- udi_ubit8_t parent_ID;
-};
-/* Special parent_ID filter values */
-#define UDI_ANY_PARENT_ID 0
-
-/**
- * \brief
- */
-extern void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID );
-/**
- * \brief Values for ::udi_devmgmt_req \a mgmt_op
- */
-enum eDMGMT
-{
- UDI_DMGMT_PREPARE_TO_SUSPEND = 1,
- UDI_DMGMT_SUSPEND,
- UDI_DMGMT_SHUTDOWN,
- UDI_DMGMT_PARENT_SUSPENDED,
- UDI_DMGMT_RESUME,
- UDI_DMGMT_UNBIND
-};
-
-extern void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
-//!\brief Values for flags
-#define UDI_DMGMT_NONTRANSPARENT (1U<<0)
-//!\brief Meta-Specific Status Codes
-#define UDI_DMGMT_STAT_ROUTING_CHANGE (UDI_STAT_META_SPECIFIC|1)
-
-extern void udi_final_cleanup_req(udi_mgmt_cb_t *cb);
-extern void udi_final_cleanup_ack(udi_mgmt_cb_t *cb);
-
-
-#endif
+++ /dev/null
-/**
- * \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
-
+++ /dev/null
-/**
- * \file udi_strmem.h
- */
-#ifndef _UDI_STRMEM_H_
-#define _UDI_STRMEM_H_
-
-/**
- * \brief Gets the length of a C style string
- */
-extern udi_size_t udi_strlen(const char *s);
-
-/**
- * \brief Appends to a string
- */
-extern char *udi_strcat(char *s1, const char *s2);
-extern char *udi_strncat(char *s1, const char *s2, udi_size_t n);
-
-/**
- * \brief Compares Strings/Memory
- */
-extern udi_sbit8_t udi_strcmp(const char *s1, const char *s2);
-extern udi_sbit8_t udi_strncmp(const char *s1, const char *s2, udi_size_t n);
-extern udi_sbit8_t udi_memcmp(const void *s1, const void *s2, udi_size_t n);
-
-extern char *udi_strcpy(char *s1, const char *s2);
-extern char *udi_strncpy(char *s1, const char *s2, udi_size_t n);
-extern void *udi_memcpy(void *s1, const void *s2, udi_size_t n);
-extern void *udi_memmove(void *s1, const void *s2, udi_size_t n);
-
-extern char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n);
-
-extern char *udi_strchr(const char *s, char c);
-extern char *udi_strrchr(const char *s, char c);
-extern void *udi_memchr (const void *s, udi_ubit8_t c, udi_size_t n);
-
-extern void *udi_memset(void *s, udi_ubit8_t c, udi_size_t n);
-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);
-
-
-
-#endif
+++ /dev/null
-
-#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
-
+++ /dev/null
-/*
- * Acess2 UDI Environment (NIC Bindings)
- * - By John Hodge (thePowersGang)
- *
- * udi_nic.h
- * - NIC Bindings core
- */
-#ifndef _UDI_NIC_H_
-#define _UDI_NIC_H_
-
-// === CBs ===
-#define UDI_NIC_STD_CB_NUM 1
-#define UDI_NIC_BIND_CB_NUM 2
-#define UDI_NIC_CTRL_CB_NUM 3
-#define UDI_NIC_STATUS_CB_NUM 4
-#define UDI_NIC_INFO_CB_NUM 5
-#define UDI_NIC_TX_CB_NUM 6
-#define UDI_NIC_RX_CB_NUM 7
-
-typedef struct {
- udi_cb_t gcb;
-} udi_nic_cb_t;
-
-#define UDI_NIC_MAC_ADDRESS_SIZE 20
-// Media type
-#define UDI_NIC_ETHER 0
-#define UDI_NIC_TOKEN 1
-#define UDI_NIC_FASTETHER 2
-#define UDI_NIC_GIGETHER 3
-#define UDI_NIC_VGANYLAN 4
-#define UDI_NIC_FDDI 5
-#define UDI_NIC_ATM 6
-#define UDI_NIC_FC 7
-#define UDI_NIC_MISCMEDIA 0xff
-// capabilities
-#define UDI_NIC_CAP_TX_IP_CKSUM (1U<<0)
-#define UDI_NIC_CAP_TX_TCP_CKSUM (1U<<1)
-#define UDI_NIC_CAP_TX_UDP_CKSUM (1U<<2)
-#define UDI_NIC_CAP_MCAST_LOOPBK (1U<<3)
-#define UDI_NIC_CAP_BCAST_LOOPBK (1U<<4)
-// capabilities (requests)
-#define UDI_NIC_CAP_USE_TX_CKSUM (1U<<30)
-#define UDI_NIC_CAP_USE_RX_CKSUM (1U<<31)
-typedef struct {
- udi_cb_t gcb;
- udi_ubit8_t media_type;
- udi_ubit32_t min_pdu_size;
- udi_ubit32_t max_pdu_size;
- udi_ubit32_t rx_hw_threshold;
- udi_ubit32_t capabilities;
- udi_ubit8_t max_perfect_multicast;
- udi_ubit8_t max_total_multicast;
- udi_ubit8_t mac_addr_len;
- udi_ubit8_t mac_addr[UDI_NIC_MAC_ADDRESS_SIZE];
-} udi_nic_bind_cb_t;
-
-// commands
-#define UDI_NIC_ADD_MULTI 1
-#define UDI_NIC_DEL_MULTI 2
-#define UDI_NIC_ALLMULTI_ON 3
-#define UDI_NIC_ALLMULTI_OFF 4
-#define UDI_NIC_GET_CURR_MAC 5
-#define UDI_NIC_SET_CURR_MAC 6
-#define UDI_NIC_GET_FACT_MAC 7
-#define UDI_NIC_PROMISC_ON 8
-#define UDI_NIC_PROMISC_OFF 9
-#define UDI_NIC_HW_RESET 10
-#define UDI_NIC_BAD_RXPKT 11
-typedef struct {
- udi_cb_t gcb;
- udi_ubit8_t command;
- udi_ubit32_t indicator;
- udi_buf_t *data_buf;
-} udi_nic_ctrl_cb_t;
-
-// event
-#define UDI_NIC_LINK_DOWN 0
-#define UDI_NIC_LINK_UP 1
-#define UDI_NIC_LINK_RESET 2
-typedef struct {
- udi_cb_t gcb;
- udi_ubit8_t event;
-} udi_nic_status_cb_t;
-
-typedef struct {
- udi_cb_t gcb;
- udi_boolean_t interface_is_active;
- udi_boolean_t link_is_active;
- udi_boolean_t is_full_duplex;
- udi_ubit32_t link_mbps;
- udi_ubit32_t link_bps;
- udi_ubit32_t tx_packets;
- udi_ubit32_t rx_packets;
- udi_ubit32_t tx_errors;
- udi_ubit32_t rx_errors;
- udi_ubit32_t tx_discards;
- udi_ubit32_t rx_discards;
- udi_ubit32_t tx_underrun;
- udi_ubit32_t rx_overrun;
- udi_ubit32_t collisions;
-} udi_nic_info_cb_t;
-
-typedef struct udi_nic_tx_cb_s {
- udi_cb_t gcb;
- struct udi_nic_tx_cb_s *chain;
- udi_buf_t *tx_buf;
- udi_boolean_t completion_urgent;
-} udi_nic_tx_cb_t;
-
-// rx_status
-#define UDI_NIC_RX_BADCKSUM (1U<<0)
-#define UDI_NIC_RX_UNDERRUN (1U<<1)
-#define UDI_NIC_RX_OVERRUN (1U<<2)
-#define UDI_NIC_RX_DRIBBLE (1U<<3)
-#define UDI_NIC_RX_FRAME_ERR (1U<<4)
-#define UDI_NIC_RX_MAC_ERR (1U<<5)
-#define UDI_NIC_RX_OTHER_ERR (1U<<7)
-// addr_match
-#define UDI_NIC_RX_UNKNOWN 0
-#define UDI_NIC_RX_EXACT 1
-#define UDI_NIC_RX_HASH 2
-#define UDI_NIC_RX_BROADCAST 3
-// rx_valid
-#define UDI_NIC_RX_GOOD_IP_CKSUM (1U<<0)
-#define UDI_NIC_RX_GOOD_TCP_CKSUM (1U<<1)
-#define UDI_NIC_RX_GOOD_UDP_CKSUM (1U<<2)
-typedef struct udi_nic_rx_cb_s {
- udi_cb_t gcb;
- struct udi_nic_rx_cb_s *chain;
- udi_buf_t *rx_buf;
- udi_ubit8_t rx_status;
- udi_ubit8_t addr_match;
- udi_ubit8_t rx_valid;
-} udi_nic_rx_cb_t;
-
-// === Function Types ===
-// - Control
-typedef void udi_nd_bind_req_op_t(udi_nic_bind_cb_t *cb, udi_index_t tx_chan_index, udi_index_t rx_chan_index);
-typedef void udi_nsr_bind_ack_op_t(udi_nic_bind_cb_t *cb, udi_status_t status);
-typedef void udi_nd_unbind_req_op_t(udi_nic_cb_t *cb);
-typedef void udi_nsr_unbind_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
-typedef void udi_nd_enable_req_op_t(udi_nic_cb_t *cb);
-typedef void udi_nsr_enable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
-typedef void udi_nd_disable_req_op_t(udi_nic_cb_t *cb);
-typedef void udi_nsr_disable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
-typedef void udi_nd_ctrl_req_op_t(udi_nic_ctrl_cb_t *cb);
-typedef void udi_nsr_ctrl_ack_op_t(udi_nic_ctrl_cb_t *cb, udi_status_t status);
-typedef void udi_nsr_status_ind_op_t(udi_nic_status_cb_t *cb);
-typedef void udi_nd_info_req_op_t(udi_nic_info_cb_t *cb, udi_boolean_t reset_statistics);
-typedef void udi_nsr_info_ack_op_t(udi_nic_info_cb_t *cb);
-// - TX
-typedef void udi_nsr_tx_rdy_op_t(udi_nic_tx_cb_t *cb);
-typedef void udi_nd_tx_req_op_t(udi_nic_tx_cb_t *cb);
-typedef void udi_nd_exp_tx_req_op_t(udi_nic_tx_cb_t *cb);
-// - RX
-typedef void udi_nsr_rx_ind_op_t(udi_nic_rx_cb_t *cb);
-typedef void udi_nsr_exp_rx_ind_op_t(udi_nic_rx_cb_t *cb);
-typedef void udi_nd_rx_rdy_op_t(udi_nic_rx_cb_t *cb);
-
-// === Functions ===
-// - Control
-extern udi_nd_bind_req_op_t udi_nd_bind_req;
-extern udi_nsr_bind_ack_op_t udi_nsr_bind_ack;
-extern udi_nd_unbind_req_op_t udi_nd_unbind_req;
-extern udi_nsr_unbind_ack_op_t udi_nsr_unbind_ack;
-extern udi_nd_enable_req_op_t udi_nd_enable_req;
-extern udi_nsr_enable_ack_op_t udi_nsr_enable_ack;
-extern udi_nd_disable_req_op_t udi_nd_disable_req;
-extern udi_nsr_disable_ack_op_t udi_nsr_disable_ack;
-extern udi_nd_ctrl_req_op_t udi_nd_ctrl_req;
-extern udi_nsr_ctrl_ack_op_t udi_nsr_ctrl_ack;
-extern udi_nsr_status_ind_op_t udi_nsr_status_ind;
-extern udi_nd_info_req_op_t udi_nd_info_req;
-extern udi_nsr_info_ack_op_t udi_nsr_info_ack;
-// - TX
-extern udi_nsr_tx_rdy_op_t udi_nsr_tx_rdy;
-extern udi_nd_tx_req_op_t udi_nd_tx_req;
-extern udi_nd_exp_tx_req_op_t udi_nd_exp_tx_req;
-// - RX
-extern udi_nsr_rx_ind_op_t udi_nsr_rx_ind;
-extern udi_nsr_exp_rx_ind_op_t udi_nsr_exp_rx_ind;
-extern udi_nd_rx_rdy_op_t udi_nd_rx_rdy;
-
-// === Op Lists ==
-#define UDI_ND_CTRL_OPS_NUM 1
-#define UDI_ND_TX_OPS_NUM 2
-#define UDI_ND_RX_OPS_NUM 3
-#define UDI_NSR_CTRL_OPS_NUM 4
-#define UDI_NSR_TX_OPS_NUM 5
-#define UDI_NSR_RX_OPS_NUM 6
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nd_bind_req_op_t *nd_bind_req_op;
- udi_nd_unbind_req_op_t *nd_unbind_req_op;
- udi_nd_enable_req_op_t *nd_enable_req_op;
- udi_nd_disable_req_op_t *nd_disable_req_op;
- udi_nd_ctrl_req_op_t *nd_ctrl_req_op;
- udi_nd_info_req_op_t *nd_info_req_op;
-} udi_nd_ctrl_ops_t;
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nd_tx_req_op_t *nd_tx_req_op;
- udi_nd_exp_tx_req_op_t *nd_exp_tx_req_op;
-} udi_nd_tx_ops_t;
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nd_rx_rdy_op_t *nd_rx_rdy_op;
-} udi_nd_rx_ops_t;
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nsr_bind_ack_op_t *nsr_bind_ack_op;
- udi_nsr_unbind_ack_op_t *nsr_unbind_ack_op;
- udi_nsr_enable_ack_op_t *nsr_enable_ack_op;
- udi_nsr_ctrl_ack_op_t *nsr_ctrl_ack_op;
- udi_nsr_info_ack_op_t *nsr_info_ack_op;
- udi_nsr_status_ind_op_t *nsr_status_ind_op;
-} udi_nsr_ctrl_ops_t;
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nsr_tx_rdy_op_t *nsr_tx_rdy_op;
-} udi_nsr_tx_ops_t;
-
-typedef const struct {
- udi_channel_event_ind_op_t *channel_event_ind_op;
- udi_nsr_rx_ind_op_t *nsr_rx_ind_op;
- udi_nsr_exp_rx_ind_op_t *nsr_exp_rx_ind_op;
-} udi_nsr_rx_ops_t;
-
-#endif
-
+++ /dev/null
-/*
- * Acess2 UDI Layer
- * - By John Hodge (thePowersGang)
- *
- * include/udi_pci.h
- * - PCI Bus Binding
- */
-#ifndef _UDI_PCI_H_
-#define _UDI_PCI_H_
-
-#ifndef _UDI_PHYSIO_H_
-# error "udi_pci.h requires udi_physio.h"
-#endif
-
-#define UDI_PCI_CONFIG_SPACE 255
-#define UDI_PCI_BAR_0 0
-#define UDI_PCI_BAR_1 1
-#define UDI_PCI_BAR_2 2
-#define UDI_PCI_BAR_3 3
-#define UDI_PCI_BAR_4 4
-#define UDI_PCI_BAR_5 5
-
-#endif
-
+++ /dev/null
-/**
- * \file udi_physio.h
- */
-#ifndef _UDI_PHYSIO_H_
-#define _UDI_PHYSIO_H_
-
-#include <udi.h>
-
-//#ifndef UDI_PHYSIO_VERSION
-//# error "UDI_PHYSIO_VERSION must be defined"
-//#endif
-
-// === TYPEDEFS ===
-// DMA Core
-typedef _udi_handle_t udi_dma_handle_t;
-#define UDI_NULL_DMA_HANDLE _NULL_HANDLE
-typedef uint64_t udi_busaddr64_t; //!< \note Opaque
-typedef struct udi_scgth_element_32_s udi_scgth_element_32_t;
-typedef struct udi_scgth_element_64_s udi_scgth_element_64_t;
-typedef struct udi_scgth_s udi_scgth_t;
-typedef _udi_handle_t udi_dma_constraints_t;
-#define UDI_NULL_DMA_CONSTRAINTS _NULL_HANDLE
-/**
- * \name DMA constraints attributes
- * \{
- */
-typedef udi_ubit8_t udi_dma_constraints_attr_t;
-/* DMA Convenience Attribute Codes */
-#define UDI_DMA_ADDRESSABLE_BITS 100
-#define UDI_DMA_ALIGNMENT_BITS 101
-/* DMA Constraints on the Entire Transfer */
-#define UDI_DMA_DATA_ADDRESSABLE_BITS 110
-#define UDI_DMA_NO_PARTIAL 111
-/* DMA Constraints on the Scatter/Gather List */
-#define UDI_DMA_SCGTH_MAX_ELEMENTS 120
-#define UDI_DMA_SCGTH_FORMAT 121
-#define UDI_DMA_SCGTH_ENDIANNESS 122
-#define UDI_DMA_SCGTH_ADDRESSABLE_BITS 123
-#define UDI_DMA_SCGTH_MAX_SEGMENTS 124
-/* DMA Constraints on Scatter/Gather Segments */
-#define UDI_DMA_SCGTH_ALIGNMENT_BITS 130
-#define UDI_DMA_SCGTH_MAX_EL_PER_SEG 131
-#define UDI_DMA_SCGTH_PREFIX_BYTES 132
-/* DMA Constraints on Scatter/Gather Elements */
-#define UDI_DMA_ELEMENT_ALIGNMENT_BITS 140
-#define UDI_DMA_ELEMENT_LENGTH_BITS 141
-#define UDI_DMA_ELEMENT_GRANULARITY_BITS 142
-/* DMA Constraints for Special Addressing */
-#define UDI_DMA_ADDR_FIXED_BITS 150
-#define UDI_DMA_ADDR_FIXED_TYPE 151
-#define UDI_DMA_ADDR_FIXED_VALUE_LO 152
-#define UDI_DMA_ADDR_FIXED_VALUE_HI 153
-/* DMA Constraints on DMA Access Behavior */
-#define UDI_DMA_SEQUENTIAL 160
-#define UDI_DMA_SLOP_IN_BITS 161
-#define UDI_DMA_SLOP_OUT_BITS 162
-#define UDI_DMA_SLOP_OUT_EXTRA 163
-#define UDI_DMA_SLOP_BARRIER_BITS 164
-/* Values for UDI_DMA_SCGTH_ENDIANNESS */
-#define UDI_DMA_LITTLE_ENDIAN (1U<<6)
-#define UDI_DMA_BIG_ENDIAN (1U<<5)
-/* Values for UDI_DMA_ADDR_FIXED_TYPE */
-#define UDI_DMA_FIXED_ELEMENT 1
-/**
- * \}
- */
-// DMA Constraints Management
-typedef struct udi_dma_constraints_attr_spec_s udi_dma_constraints_attr_spec_t;
-typedef void udi_dma_constraints_attr_set_call_t(
- udi_cb_t *gcb, udi_dma_constraints_t new_constraints, udi_status_t status
- );
-typedef struct udi_dma_limits_s udi_dma_limits_t;
-
-
-// === STRUCTURES ===
-// --- DMA Constraints Management ---
-struct udi_dma_constraints_attr_spec_s
-{
- udi_dma_constraints_attr_t attr_type;
- udi_ubit32_t attr_value;
-};
-// --- DMA Core ---
-struct udi_dma_limits_s
-{
- udi_size_t max_legal_contig_alloc;
- udi_size_t max_safe_contig_alloc;
- udi_size_t cache_line_size;
-};
-struct udi_scgth_element_32_s
-{
- udi_ubit32_t block_busaddr;
- udi_ubit32_t block_length;
-};
-struct udi_scgth_element_64_s
-{
- udi_busaddr64_t block_busaddr;
- udi_ubit32_t block_length;
- udi_ubit32_t el_reserved;
-};
-/* Extension Flag */
-#define UDI_SCGTH_EXT 0x80000000
-struct udi_scgth_s
-{
- udi_ubit16_t scgth_num_elements;
- udi_ubit8_t scgth_format;
- udi_boolean_t scgth_must_swap;
- union {
- udi_scgth_element_32_t *el32p;
- udi_scgth_element_64_t *el64p;
- } scgth_elements;
- union {
- udi_scgth_element_32_t el32;
- udi_scgth_element_64_t el64;
- } scgth_first_segment;
-};
-/* Values for scgth_format */
-#define UDI_SCGTH_32 (1U<<0)
-#define UDI_SCGTH_64 (1U<<1)
-#define UDI_SCGTH_DMA_MAPPED (1U<<6)
-#define UDI_SCGTH_DRIVER_MAPPED (1U<<7)
-
-
-
-// === FUNCTIONS ===
-#include <physio/dma_const.h>
-#include <physio/dma.h>
-#include <physio/meta_intr.h>
-#include <physio/meta_bus.h>
-#include "physio/pio.h"
-
-#include "physio/pci.h"
-
-#endif
+++ /dev/null
-/**
- * \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
-
@echo --- $(CC) -o $@
@mkdir -p $(dir $@)
@$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
- @$(CC) -M $(CPPFLAGS) -MT $@ -o obj-$(_SUFFIX)/$*.d $<
+ @$(CC) -M $(CPPFLAGS) -MT $@ -MP -o obj-$(_SUFFIX)/$*.d $<
-include $(DEPFILES)
# vim: ft=make
--- /dev/null
+/*
+ */
+#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
+
--- /dev/null
+/*
+ *
+ */
+#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
--- /dev/null
+/**
+ * \file physio/meta_bus.h
+ */
+#ifndef _PHYSIO_META_BUS_H_
+#define _PHYSIO_META_BUS_H_
+
+#include <udi.h>
+#include <udi_physio.h>
+
+typedef const struct udi_bus_device_ops_s udi_bus_device_ops_t;
+typedef const struct udi_bus_bridge_ops_s udi_bus_bridge_ops_t;
+typedef struct udi_bus_bind_cb_s udi_bus_bind_cb_t;
+typedef void udi_bus_unbind_req_op_t(udi_bus_bind_cb_t *cb);
+typedef void udi_bus_unbind_ack_op_t(udi_bus_bind_cb_t *cb);
+typedef void udi_bus_bind_req_op_t(udi_bus_bind_cb_t *cb);
+typedef void udi_bus_bind_ack_op_t(
+ udi_bus_bind_cb_t *cb,
+ udi_dma_constraints_t dma_constraints,
+ udi_ubit8_t preferred_endianness,
+ udi_status_t status
+ );
+
+
+struct udi_bus_device_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_bus_bind_ack_op_t *bus_bind_ack_op;
+ udi_bus_unbind_ack_op_t *bus_unbind_ack_op;
+ udi_intr_attach_ack_op_t *intr_attach_ack_op;
+ udi_intr_detach_ack_op_t *intr_detach_ack_op;
+};
+/* Bus Device Ops Vector Number */
+#define UDI_BUS_DEVICE_OPS_NUM 1
+
+struct udi_bus_bridge_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_bus_bind_req_op_t *bus_bind_req_op;
+ udi_bus_unbind_req_op_t *bus_unbind_req_op;
+ udi_intr_attach_req_op_t *intr_attach_req_op;
+ udi_intr_detach_req_op_t *intr_detach_req_op;
+};
+/* Bus Bridge Ops Vector Number */
+#define UDI_BUS_BRIDGE_OPS_NUM 2
+
+struct udi_bus_bind_cb_s
+{
+ udi_cb_t gcb;
+};
+/* Bus Bind Control Block Group Number */
+#define UDI_BUS_BIND_CB_NUM 1
+
+
+extern void udi_bus_bind_req(udi_bus_bind_cb_t *cb);
+
+extern 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
+ );
+/* Values for preferred_endianness */
+#define UDI_DMA_BIG_ENDIAN (1U<<5)
+#define UDI_DMA_LITTLE_ENDIAN (1U<<6)
+#define UDI_DMA_ANY_ENDIAN (1U<<0)
+
+extern void udi_bus_unbind_req(udi_bus_bind_cb_t *cb);
+extern void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb);
+
+
+
+
+
+#endif
--- /dev/null
+/**
+ * \file physio/meta_intr.h
+ */
+#ifndef _PHYSIO_META_INTR_H_
+#define _PHYSIO_META_INTR_H_
+
+#include <udi.h>
+#include <udi_physio.h>
+#include "pio.h"
+
+typedef struct udi_intr_attach_cb_s udi_intr_attach_cb_t;
+typedef void udi_intr_attach_req_op_t(udi_intr_attach_cb_t *intr_attach_cb);
+typedef void udi_intr_attach_ack_op_t(
+ udi_intr_attach_cb_t *intr_attach_cb,
+ udi_status_t status
+ );
+typedef struct udi_intr_detach_cb_s udi_intr_detach_cb_t;
+typedef void udi_intr_detach_req_op_t(udi_intr_detach_cb_t *intr_detach_cb);
+typedef void udi_intr_detach_ack_op_t(udi_intr_detach_cb_t *intr_detach_cb);
+typedef const struct udi_intr_handler_ops_s udi_intr_handler_ops_t;
+typedef const struct udi_intr_dispatcher_ops_s udi_intr_dispatcher_ops_t;
+typedef struct udi_intr_event_cb_s udi_intr_event_cb_t;
+typedef void udi_intr_event_ind_op_t(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
+typedef void udi_intr_event_rdy_op_t(udi_intr_event_cb_t *intr_event_cb);
+
+
+struct udi_intr_attach_cb_s
+{
+ udi_cb_t gcb;
+ udi_index_t interrupt_idx;
+ udi_ubit8_t min_event_pend;
+ udi_pio_handle_t preprocessing_handle;
+};
+/* Bridge Attach Control Block Group Number */
+#define UDI_BUS_INTR_ATTACH_CB_NUM 2
+
+struct udi_intr_detach_cb_s
+{
+ udi_cb_t gcb;
+ udi_index_t interrupt_idx;
+};
+/* Bridge Detach Control Block Group Number */
+#define UDI_BUS_INTR_DETACH_CB_NUM 3
+
+struct udi_intr_handler_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_intr_event_ind_op_t *intr_event_ind_op;
+};
+/* Interrupt Handler Ops Vector Number */
+#define UDI_BUS_INTR_HANDLER_OPS_NUM 3
+
+struct udi_intr_dispatcher_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_intr_event_rdy_op_t *intr_event_rdy_op;
+};
+/* Interrupt Dispatcher Ops Vector Number */
+#define UDI_BUS_INTR_DISPATCH_OPS_NUM 4
+
+struct udi_intr_event_cb_s
+{
+ udi_cb_t gcb;
+ udi_buf_t *event_buf;
+ udi_ubit16_t intr_result;
+};
+/* Flag values for interrupt handling */
+#define UDI_INTR_UNCLAIMED (1U<<0)
+#define UDI_INTR_NO_EVENT (1U<<1)
+/* Bus Interrupt Event Control Block Group Number */
+#define UDI_BUS_INTR_EVENT_CB_NUM 4
+
+
+
+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_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_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
+/**
+ * \brief Values for ::udi_intr_event_ind \a flags
+ * \{
+ */
+#define UDI_INTR_MASKING_NOT_REQUIRED (1U<<0)
+#define UDI_INTR_OVERRUN_OCCURRED (1U<<1)
+#define UDI_INTR_PREPROCESSED (1U<<2)
+/**
+ * \}
+ */
+
+extern void udi_intr_event_rdy(udi_intr_event_cb_t *intr_event_cb);
+
+
+
+#endif
--- /dev/null
+/*
+ */
+#ifndef _UDI_PHYSIO_PCI_H_
+#define _UDI_PHYSIO_PCI_H_
+
+#define UDI_PCI_CONFIG_SPACE 255
+#define UDI_PCI_BAR_0 0
+#define UDI_PCI_BAR_1 1
+#define UDI_PCI_BAR_2 2
+#define UDI_PCI_BAR_3 3
+#define UDI_PCI_BAR_4 4
+#define UDI_PCI_BAR_5 5
+
+#endif
+
--- /dev/null
+/**
+ * \file physio/pio.h
+ */
+#ifndef _PHYSIO_PIO_H_
+#define _PHYSIO_PIO_H_
+
+#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 Register numbers in pio_op
+ */
+enum {
+ UDI_PIO_R0,
+ UDI_PIO_R1,
+ UDI_PIO_R2,
+ UDI_PIO_R3,
+ UDI_PIO_R4,
+ UDI_PIO_R5,
+ UDI_PIO_R6,
+ UDI_PIO_R7,
+};
+// Addressing modes
+#define UDI_PIO_DIRECT 0x00
+#define UDI_PIO_SCRATCH 0x08
+#define UDI_PIO_BUF 0x10
+#define UDI_PIO_MEM 0x18
+// Class A opcodes
+#define UDI_PIO_IN 0x00
+#define UDI_PIO_OUT 0x20
+#define UDI_PIO_LOAD 0x40
+#define UDI_PIO_STORE 0x60
+// Class B opcodes
+#define UDI_PIO_LOAD_IMM 0x80
+#define UDI_PIO_CSKIP 0x88
+#define UDI_PIO_IN_IND 0x90
+#define UDI_PIO_OUT_IND 0x98
+#define UDI_PIO_SHIFT_LEFT 0xA0
+#define UDI_PIO_SHIFT_RIGHT 0xA8
+#define UDI_PIO_AND 0xB0
+#define UDI_PIO_AND_IMM 0xB8
+#define UDI_PIO_OR 0xC0
+#define UDI_PIO_OR_IMM 0xC8
+#define UDI_PIO_XOR 0xD0
+#define UDI_PIO_ADD 0xD8
+#define UDI_PIO_ADD_IMM 0xE0
+#define UDI_PIO_SUB 0xE8
+// Class C opcodes
+#define UDI_PIO_BRANCH 0xF0
+#define UDI_PIO_LABEL 0xF1
+#define UDI_PIO_REP_IN_IND 0xF2
+#define UDI_PIO_REP_OUT_IND 0xF3
+#define UDI_PIO_DELAY 0xF4
+#define UDI_PIO_BARRIER 0xF5
+#define UDI_PIO_SYNC 0xF6
+#define UDI_PIO_SYNC_OUT 0xF7
+#define UDI_PIO_DEBUG 0xF8
+#define UDI_PIO_END 0xFE
+#define UDI_PIO_END_IMM 0xFF
+// Values for UDI_PIO_DEBUG's operand
+#define UDI_PIO_TRACE_OPS_NONE 0
+#define UDI_PIO_TRACE_OPS1 1
+#define UDI_PIO_TRACE_OPS2 2
+#define UDI_PIO_TRACE_OPS3 3
+#define UDI_PIO_TRACE_REGS_NONE (0U<<2)
+#define UDI_PIO_TRACE_REGS1 (1U<<2)
+#define UDI_PIO_TRACE_REGS2 (2U<<2)
+#define UDI_PIO_TRACE_REGS3 (3U<<2)
+#define UDI_PIO_TRACE_DEV_NONE (0U<<4)
+#define UDI_PIO_TRACE_DEV1 (1U<<4)
+#define UDI_PIO_TRACE_DEV2 (2U<<4)
+#define UDI_PIO_TRACE_DEV3 (3U<<4)
+// Values for conditional operations
+#define UDI_PIO_Z 0 // reg == 0
+#define UDI_PIO_NZ 1 // reg != 0
+#define UDI_PIO_NEG 2 // reg < 0 (signed)
+#define UDI_PIO_NNEG 3 // reg >= 0 (signed)
+
+#define UDI_PIO_REP_ARGS(mode,mem_reg,mem_stride,pio_reg,pio_stride,cnt_reg) \
+ ((mode)|(mem_reg)|((mem_stride)<<5)|((pio_reg)<<7)|((pio_stride)<<10)|((cnt_reg)<<13))
+
+//! \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);
+
+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
--- /dev/null
+/**
+ * \file udi.h
+ */
+#ifndef _UDI_H_
+#define _UDI_H_
+
+#include <stdint.h>
+#include <stdarg.h>
+
+typedef int8_t udi_sbit8_t; /* signed 8-bit: -2^7..2^7-1 */
+typedef int16_t udi_sbit16_t; /* signed 16-bit: -2^15..2^15-1 */
+typedef int32_t udi_sbit32_t; /* signed 32-bit: -2^31..2^31-1 */
+typedef uint8_t udi_ubit8_t; /* unsigned 8-bit: 0..28-1 */
+typedef uint16_t udi_ubit16_t; /* unsigned 16-bit: 0..216-1 */
+typedef uint32_t udi_ubit32_t; /* unsigned 32-bit: 0..232-1 */
+
+#ifndef NULL
+# define NULL ((void*)0)
+#endif
+
+#if UDI_ABI_is_ia32
+#include "udi/arch/ia32.h"
+#else
+#error "Unknown UDI ABI"
+#endif
+
+/**
+ * \name Values and Flags for udi_status_t
+ * \{
+ */
+#define UDI_STATUS_CODE_MASK 0x0000FFFF
+#define UDI_STAT_META_SPECIFIC 0x00008000
+#define UDI_SPECIFIC_STATUS_MASK 0x00007FFF
+#define UDI_CORRELATE_OFFSET 16
+#define UDI_CORRELATE_MASK 0xFFFF0000
+/* Common Status Values */
+#define UDI_OK 0
+#define UDI_STAT_NOT_SUPPORTED 1
+#define UDI_STAT_NOT_UNDERSTOOD 2
+#define UDI_STAT_INVALID_STATE 3
+#define UDI_STAT_MISTAKEN_IDENTITY 4
+#define UDI_STAT_ABORTED 5
+#define UDI_STAT_TIMEOUT 6
+#define UDI_STAT_BUSY 7
+#define UDI_STAT_RESOURCE_UNAVAIL 8
+#define UDI_STAT_HW_PROBLEM 9
+#define UDI_STAT_NOT_RESPONDING 10
+#define UDI_STAT_DATA_UNDERRUN 11
+#define UDI_STAT_DATA_OVERRUN 12
+#define UDI_STAT_DATA_ERROR 13
+#define UDI_STAT_PARENT_DRV_ERROR 14
+#define UDI_STAT_CANNOT_BIND 15
+#define UDI_STAT_CANNOT_BIND_EXCL 16
+#define UDI_STAT_TOO_MANY_PARENTS 17
+#define UDI_STAT_BAD_PARENT_TYPE 18
+#define UDI_STAT_TERMINATED 19
+#define UDI_STAT_ATTR_MISMATCH 20
+/**
+ * \}
+ */
+
+/**
+ * \name Data Layout Specifiers
+ * \{
+ */
+typedef const udi_ubit8_t udi_layout_t;
+/* Specific-Length Layout Type Codes */
+#define UDI_DL_UBIT8_T 1
+#define UDI_DL_SBIT8_T 2
+#define UDI_DL_UBIT16_T 3
+#define UDI_DL_SBIT16_T 4
+#define UDI_DL_UBIT32_T 5
+#define UDI_DL_SBIT32_T 6
+#define UDI_DL_BOOLEAN_T 7
+#define UDI_DL_STATUS_T 8
+/* Abstract Element Layout Type Codes */
+#define UDI_DL_INDEX_T 20
+/* Opaque Handle Element Layout Type Codes */
+#define UDI_DL_CHANNEL_T 30
+#define UDI_DL_ORIGIN_T 32
+/* Indirect Element Layout Type Codes */
+#define UDI_DL_BUF 40
+#define UDI_DL_CB 41
+#define UDI_DL_INLINE_UNTYPED 42
+#define UDI_DL_INLINE_DRIVER_TYPED 43
+#define UDI_DL_MOVABLE_UNTYPED 44
+/* Nested Element Layout Type Codes */
+#define UDI_DL_INLINE_TYPED 50
+#define UDI_DL_MOVABLE_TYPED 51
+#define UDI_DL_ARRAY 52
+#define UDI_DL_END 0
+/**
+ * \}
+ */
+
+
+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
+#include "udi/meta_mgmt.h" // Management Metalanguage
+#include "udi/meta_gio.h" // General IO Metalanguage
+#include "udi/init.h" // Init
+
+#endif
--- /dev/null
+
+#ifndef _UDI_ARCH_x86_H_
+#define _UDI_ARCH_x86_H_
+
+typedef udi_ubit8_t udi_boolean_t; /* 0=False; 1..28-1=True */
+#define FALSE 0
+#define TRUE 1
+
+typedef uint32_t udi_size_t; /* buffer size */
+typedef udi_ubit8_t udi_index_t; /* zero-based index type */
+
+typedef void *_udi_handle_t;
+#define _NULL_HANDLE ((void*)0)
+
+/* Channel Handle */
+typedef _udi_handle_t *udi_channel_t;
+#define UDI_NULL_CHANNEL _NULL_HANDLE
+
+/**
+ * \brief Buffer Path
+ */
+typedef _udi_handle_t udi_buf_path_t;
+#define UDI_NULL_BUF_PATH _NULL_HANDLE
+
+typedef _udi_handle_t udi_origin_t;
+#define UDI_NULL_ORIGIN _NULL_HANDLE
+
+typedef int64_t udi_timestamp_t;
+
+#define UDI_HANDLE_IS_NULL(handle, handle_type) (handle == NULL)
+#define UDI_HANDLE_ID(handle, handle_type) ((uint32_t)handle)
+
+/**
+ * \name va_arg wrapper
+ * \{
+ */
+#define UDI_VA_ARG(pvar, type, va_code) va_arg(pvar,type)
+#define UDI_VA_UBIT8_T
+#define UDI_VA_SBIT8_T
+#define UDI_VA_UBIT16_T
+#define UDI_VA_SBIT16_T
+#define UDI_VA_UBIT32_T
+#define UDI_VA_SBIT32_T
+#define UDI_VA_BOOLEAN_T
+#define UDI_VA_INDEX_T
+#define UDI_VA_SIZE_T
+#define UDI_VA_STATUS_T
+#define UDI_VA_CHANNEL_T
+#define UDI_VA_ORIGIN_T
+#define UDI_VA_POINTER
+/**
+ * \}
+ */
+
+/**
+ * \brief Status Type
+ */
+typedef udi_ubit32_t udi_status_t;
+
+#endif
--- /dev/null
+/**
+ * \file udi_attr.h
+ */
+#ifndef _UDI_ATTR_H_
+#define _UDI_ATTR_H_
+
+typedef struct udi_instance_attr_list_s udi_instance_attr_list_t;
+typedef udi_ubit8_t udi_instance_attr_type_t;
+
+/* Instance attribute limits */
+#define UDI_MAX_ATTR_NAMELEN 32
+#define UDI_MAX_ATTR_SIZE 64
+
+#define UDI_ATTR32_SET(aval, v) \
+ { udi_ubit32_t vtmp = (v); \
+ (aval)[0] = (vtmp) & 0xff; \
+ (aval)[1] = ((vtmp) >> 8) & 0xff; \
+ (aval)[2] = ((vtmp) >> 16) & 0xff; \
+ (aval)[3] = ((vtmp) >> 24) & 0xff; }
+#define UDI_ATTR32_GET(aval) \
+ ((aval)[0] + ((aval)[1] << 8) + \
+ ((aval)[2] << 16) + ((aval)[3] << 24))
+#define UDI_ATTR32_INIT(v) \
+ { (v) & 0xff, ((v) >> 8) & 0xff, \
+ ((v) >> 16) & 0xff, ((v) >> 24) & 0xff }
+
+/**
+ * \brief Instance Attribute
+ */
+struct udi_instance_attr_list_s
+{
+ char attr_name[UDI_MAX_ATTR_NAMELEN];
+ udi_ubit8_t attr_value[UDI_MAX_ATTR_SIZE];
+ udi_ubit8_t attr_length;
+ udi_instance_attr_type_t attr_type;
+};
+
+
+/**
+ * \brief Instance Attribute Types
+ * \see ::udi_instance_attr_type_t
+ */
+enum
+{
+ UDI_ATTR_NONE,
+ UDI_ATTR_STRING,
+ UDI_ATTR_ARRAY8,
+ UDI_ATTR_UBIT32,
+ UDI_ATTR_BOOLEAN,
+ UDI_ATTR_FILE
+};
+
+
+#endif
--- /dev/null
+/**
+ * \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;
+ udi_ubit8_t 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
--- /dev/null
+/**
+ * \file udi_cb.h
+ */
+#ifndef _UDI_CB_H_
+#define _UDI_CB_H_
+
+typedef struct udi_cb_s udi_cb_t;
+typedef void udi_cb_alloc_call_t(udi_cb_t *gcb, udi_cb_t *new_cb);
+typedef void udi_cb_alloc_batch_call_t(udi_cb_t *gcb, udi_cb_t *first_new_cb);
+typedef void udi_cancel_call_t(udi_cb_t *gcb);
+
+#define UDI_GCB(mcb) (&(mcb)->gcb)
+#define UDI_MCB(gcb, cb_type) ((cb_type *)(gcb))
+
+/**
+ * \brief Describes a generic control block
+ * \note Semi-opaque
+ */
+struct udi_cb_s
+{
+ /**
+ * \brief Channel associated with the control block
+ */
+ udi_channel_t channel;
+ /**
+ * \brief Current state
+ * \note Driver changable
+ */
+ void *context;
+ /**
+ * \brief CB's scratch area
+ */
+ void *scratch;
+ /**
+ * \brief Source-usable value
+ */
+ void *initiator_context;
+ /**
+ * \brief Request Handle?
+ */
+ udi_origin_t origin;
+};
+
+extern void udi_cb_alloc (
+ udi_cb_alloc_call_t *callback,
+ udi_cb_t *gcb,
+ udi_index_t cb_idx,
+ udi_channel_t default_channel
+ );
+
+extern 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
+ );
+
+extern 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
+ );
+
+extern void udi_cb_free(udi_cb_t *cb);
+
+extern void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb);
+
+
+
+
+#endif
--- /dev/null
+/**
+ * \file udi_imc.h
+ * \brief Inter-Module Communication
+ */
+#ifndef _UDI_IMC_H_
+#define _UDI_IMC_H_
+
+typedef void udi_channel_anchor_call_t(udi_cb_t *gcb, udi_channel_t anchored_channel);
+typedef void udi_channel_spawn_call_t(udi_cb_t *gcb, udi_channel_t new_channel);
+
+typedef struct udi_channel_event_cb_s udi_channel_event_cb_t;
+
+typedef void udi_channel_event_ind_op_t(udi_channel_event_cb_t *cb);
+
+/**
+ * \brief Anchors a channel end to the current region
+ */
+extern 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
+ );
+
+/**
+ * \brief Created a new channel between two regions
+ */
+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
+ );
+
+/**
+ * \brief Attaches a new context pointer to the current channel
+ */
+extern void udi_channel_set_context(
+ udi_channel_t target_channel,
+ void *channel_context
+ );
+/**
+ * \brief
+ */
+extern void udi_channel_op_abort(
+ udi_channel_t target_channel,
+ udi_cb_t *orig_cb
+ );
+
+/**
+ * \brief Closes an open channel
+ */
+extern void udi_channel_close(udi_channel_t channel);
+
+/**
+ * \brief Describes a channel event
+ */
+struct udi_channel_event_cb_s
+{
+ udi_cb_t gcb;
+ udi_ubit8_t event;
+ union {
+ struct {
+ udi_cb_t *bind_cb;
+ } internal_bound;
+ struct {
+ udi_cb_t *bind_cb;
+ udi_ubit8_t parent_ID;
+ udi_buf_path_t *path_handles;
+ } parent_bound;
+ udi_cb_t *orig_cb;
+ } params;
+};
+/* Channel event types */
+#define UDI_CHANNEL_CLOSED 0
+#define UDI_CHANNEL_BOUND 1
+#define UDI_CHANNEL_OP_ABORTED 2
+
+/**
+ * \brief Proxy function
+ */
+extern void udi_channel_event_ind(udi_channel_event_cb_t *cb);
+
+/**
+ * \brief Called when channel event is completed
+ */
+extern void udi_channel_event_complete(
+ udi_channel_event_cb_t *cb, udi_status_t status
+ );
+
+
+#endif
--- /dev/null
+/**
+ * \file udi_init.h
+ */
+#ifndef _UDI_INIT_H_
+#define _UDI_INIT_H_
+
+/**
+ * \brief UDI Initialisation Structure
+ *
+ * Defines how to initialise and use a UDI driver
+ */
+struct udi_init_s
+{
+ /**
+ * \brief Defines the primary region
+ * \note For secondary modules this must be NULL
+ */
+ udi_primary_init_t *primary_init_info;
+
+ /**
+ * \brief Defines all secondary regions
+ * Pointer to a list (so, essentially an array) of ::udi_secondary_init_t
+ * It is terminated by an entry with ::udi_secondary_init_t.region_idx
+ * set to zero.
+ * \note If NULL, it is to be treated as an empty list
+ */
+ udi_secondary_init_t *secondary_init_list;
+
+ /**
+ * \brief Channel operations
+ * Pointer to a ::udi_ops_init_t.ops_idx == 0 terminated list that
+ * defines the channel opterations usage for each ops vector implemented
+ * in this module.
+ * \note Must contain at least one entry for each metalanguage used
+ */
+ udi_ops_init_t *ops_init_list;
+
+ /**
+ * \brief Control Blocks
+ */
+ udi_cb_init_t *cb_init_list;
+
+ /**
+ * \brief Generic Control Blocks
+ */
+ udi_gcb_init_t *gcb_init_list;
+
+ /**
+ * \brief Overrides for control blocks
+ * Allows a control block to override the ammount of scratch space it
+ * gets for a specific ops vector.
+ */
+ udi_cb_select_t *cb_select_list;
+} __attribute__((packed));
+
+
+/**
+ * \name Flags for ::udi_primary_init_t.mgmt_op_flags
+ * \{
+ */
+
+/**
+ * \brief Tells the environment that this operation may take some time
+ * Used as a hint in scheduling tasks
+ */
+#define UDI_OP_LONG_EXEC 0x01
+
+/**
+ * \}
+ */
+
+/**
+ * \brief Describes the Primary Region
+ * Tells the environment how to set up the driver's primary region.
+ */
+struct udi_primary_init_s
+{
+ /**
+ * \brief Management Ops Vector
+ * Pointer to a list of functions for the Management Metalanguage
+ */
+ udi_mgmt_ops_t *mgmt_ops;
+
+ /**
+ * \brief Flags for \a mgmt_ops
+ * Each entry in \a mgmt_ops is acommanied by an entry in this array.
+ * Each entry contains the flags that apply to the specified ops vector.
+ * \see UDI_OP_LONG_EXEC
+ */
+ const udi_ubit8_t *mgmt_op_flags;
+
+ /**
+ * \brief Scratch space size
+ * Specifies the number of bytes to allocate for each control block
+ * passed by the environment.
+ * \note must not exceed ::UDI_MAX_SCRATCH
+ */
+ udi_size_t mgmt_scratch_requirement;
+
+ /**
+ * \todo What is this?
+ */
+ udi_ubit8_t enumeration_attr_list_length;
+
+ /**
+ * \brief Size in bytes to allocate to each instance of the primary
+ * region
+ * Essentially the size of the driver's instance state
+ * \note Must be at least sizeof(udi_init_context_t) and not more
+ * than UDI_MIN_ALLOC_LIMIT
+ */
+ udi_size_t rdata_size;
+
+ /**
+ * \brief Size in bytes to allocate for each call to ::udi_enumerate_req
+ * \note Must not exceed UDI_MIN_ALLOC_LIMIT
+ */
+ udi_size_t child_data_size;
+
+ /**
+ * \brief Number of path handles for each parent bound to this driver
+ * \todo What the hell are path handles?
+ */
+ udi_ubit8_t per_parent_paths;
+};
+
+/**
+ * \brief Tells the environment how to create a secondary region
+ */
+struct udi_secondary_init_s
+{
+ /**
+ * \brief Region Index
+ * Non-zero driver-dependent index value that identifies the region
+ * \note This corresponds to a "region" declaration in the udiprops.txt
+ * file.
+ */
+ udi_index_t region_idx;
+ /**
+ * \brief Number of bytes to allocate
+ *
+ * \note Again, must be between sizeof(udi_init_context_t) and
+ * UDI_MIN_ALLOC_LIMIT
+ */
+ udi_size_t rdata_size;
+};
+
+/**
+ * \brief Defines channel endpoints (ways of communicating with the driver)
+ *
+ */
+struct udi_ops_init_s
+{
+ /**
+ * \brief ops index number
+ * Used to uniquely this entry
+ * \note If this is zero, it marks the end of the list
+ */
+ udi_index_t ops_idx;
+ /**
+ * \brief Metalanguage Index
+ * Defines what metalanguage is used
+ */
+ udi_index_t meta_idx;
+ /**
+ * \brief Metalanguage Operation
+ * Defines what metalanguage operation is used
+ */
+ udi_index_t meta_ops_num;
+ /**
+ * \brief Size of the context area
+ * \note If non-zero, must be at least
+ */
+ udi_size_t chan_context_size;
+ /**
+ * \brief Pointer to the operations
+ * Pointer to a <<meta>>_<<role>>_ops_t structure
+ */
+ udi_ops_vector_t *ops_vector;
+ /**
+ * \brief Flags for each entry in \a ops_vector
+ */
+ const udi_ubit8_t *op_flags;
+};
+
+/**
+ * \brief Defines control blocks
+ * Much the same as ::udi_ops_init_t
+ */
+struct udi_cb_init_s
+{
+ udi_index_t cb_idx;
+ udi_index_t meta_idx;
+ udi_index_t meta_cb_num;
+ udi_size_t scratch_requirement;
+ /**
+ * \brief Size of inline memory
+ */
+ udi_size_t inline_size;
+ /**
+ * \brief Layout of inline memory
+ */
+ udi_layout_t *inline_layout;
+};
+
+/**
+ * \brief Overrides the scratch size for an operation
+ */
+struct udi_cb_select_s
+{
+ udi_index_t ops_idx;
+ udi_index_t cb_idx;
+};
+
+/**
+ * \brief General Control Blocks
+ * These control blocks can only be used as general data storage, not
+ * for any channel operations.
+ */
+struct udi_gcb_init_s
+{
+ udi_index_t cb_idx;
+ udi_size_t scratch_requirement;
+};
+
+
+// ===
+// ===
+/**
+ * \brief Environement Imposed Limits
+ */
+struct udi_limits_s
+{
+ /**
+ * \brief Maximum legal ammount of memory that can be allocated
+ */
+ udi_size_t max_legal_alloc;
+
+ /**
+ * \brief Maximum ammount of guaranteed memory
+ */
+ udi_size_t max_safe_alloc;
+ /**
+ * \brief Maximum size of the final string from ::udi_trace_write
+ * or ::udi_log_write
+ */
+ udi_size_t max_trace_log_formatted_len;
+ /**
+ * \brief Maximum legal size of an instanct attribute value
+ */
+ udi_size_t max_instance_attr_len;
+ /**
+ * \brief Minumum time difference (in nanoseconds between unique values
+ * returned by ::udi_time_current
+ */
+ udi_ubit32_t min_curtime_res;
+ /**
+ * \brief Minimum resolution of timers
+ * \see ::udi_timer_start_repeating, ::udi_timer_start
+ */
+ udi_ubit32_t min_timer_res;
+} __attribute__((packed));
+
+/**
+ * \brief Primary Region Context data
+ */
+struct udi_init_context_s
+{
+ udi_index_t region_idx;
+ udi_limits_t limits;
+};
+
+/**
+ * \brief Channel context data
+ */
+struct udi_chan_context_s
+{
+ /**
+ * \brief Pointer to the driver instance's initial region data
+ */
+ void *rdata;
+} __attribute__((packed));
+
+/**
+ * \brief Child Channel context
+ */
+struct udi_child_chan_context_s
+{
+ /**
+ * \brief Pointer to the driver instance's initial region data
+ */
+ void *rdata;
+ /**
+ * \brief Some sort of unique ID number
+ */
+ udi_ubit32_t child_ID;
+};
+
+#endif
--- /dev/null
+/**
+ * \file udi_log.h
+ */
+#ifndef _UDI_LOG_H_
+#define _UDI_LOG_H_
+
+/**
+ * \brief Trace Event
+ */
+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
+ */
+typedef void udi_log_write_call_t(udi_cb_t *gcb, udi_status_t correlated_status);
+
+/**
+ * \name Log Severities
+ * \brief Values for severity
+ * \{
+ */
+#define UDI_LOG_DISASTER 1
+#define UDI_LOG_ERROR 2
+#define UDI_LOG_WARNING 3
+#define UDI_LOG_INFORMATION 4
+/**
+ * \}
+ */
+
+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
--- /dev/null
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ *
+ * include/udi/mei.h
+ * - Metalanguage-to-Environment Interface
+ */
+#ifndef _UDI__MEI_H_
+#define _UDI__MEI_H_
+
+typedef const struct udi_mei_init_s udi_mei_init_t;
+typedef const struct udi_mei_ops_vec_template_s udi_mei_ops_vec_template_t;
+typedef const struct uid_mei_op_template_s uid_mei_op_template_t;
+
+typedef udi_ubit8_t udi_mei_enumeration_rank_func_t(udi_ubit32_t attr_device_match, void **attr_value_list);
+typedef void udi_mei_direct_stub_t(udi_op_t *op, udi_cb_t *gcb, va_list arglist);
+typedef void udi_mei_backend_stub_t(udi_op_t *op, udi_cb_t *gcb, void *marshal_space);
+
+struct udi_mei_init_s
+{
+ udi_mei_ops_vec_template_t *ops_vec_template_list;
+ udi_mei_enumeration_rank_func_t *mei_enumeration_rank;
+};
+
+struct udi_mei_ops_vec_template_s
+{
+ udi_index_t meta_ops_num;
+ udi_ubit8_t relationship;
+ const udi_mei_op_template_t *op_template_list;
+};
+// Flags for `relationship`
+#define UDI_MEI_REL_INITIATOR (1U<<0)
+#define UDI_MEI_REL_BIND (1U<<1)
+#define UDI_MEI_REL_EXTERNAL (1U<<2)
+#define UDI_MEI_REL_INTERNAL (1U<<3)
+#define UDI_MEI_REL_SINGLE (1U<<4)
+
+struct uid_mei_op_template_s
+{
+ const char *op_name;
+ udi_ubit8_t op_category;
+ udi_ubit8_t op_flags;
+ udi_index_t meta_cb_num;
+ udi_index_t completion_ops_num;
+ udi_index_t completion_vec_idx;
+ udi_index_t exception_ops_num;
+ udi_index_t exception_vec_idx;
+ udi_mei_direct_stub_t *direct_stub;
+ udi_mei_backend_stub_t *backend_stub;
+ udi_layout_t *visible_layout;
+ udi_layout_t *marshal_layout;
+};
+/* Values for op_category */
+#define UDI_MEI_OPCAT_REQ 1
+#define UDI_MEI_OPCAT_ACK 2
+#define UDI_MEI_OPCAT_NAK 3
+#define UDI_MEI_OPCAT_IND 4
+#define UDI_MEI_OPCAT_RES 5
+#define UDI_MEI_OPCAT_RDY 6
+/* Values for op_flags */
+#define UDI_MEI_OP_ABORTABLE (1U<<0)
+#define UDI_MEI_OP_RECOVERABLE (1U<<1)
+#define UDI_MEI_OP_STATE_CHANGE (1U<<2)
+/* Maximum Sizes For Control Block Layouts */
+#define UDI_MEI_MAX_VISIBLE_SIZE 2000
+#define UDI_MEI_MAX_MARSHAL_SIZE 4000
+
+#define _UDI_MEI_FIRST(lst, ...) lst
+#define _UDI_MEI_OTHER(lst, ...) __VA_ARGS__
+#define _UDI_MEI_VARG(type,name,vatype) \
+ type name = UDI_VA_ARG(arglist, type, vatype);
+#define _UDI_MEI_VARGS0()
+#define _UDI_MEI_VARGS1(args,argt,argva) \
+ _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva))
+#define _UDI_MEI_VARGS2(args,argt,argva) \
+ _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva)) \
+ _UDI_MEI_VARGS1( _UDI_MEI_OTHER(argt), _UDI_MEI_OTHER(args), _UDI_MEI_OTHER(argva) )
+
+#define UDI_MEI_STUBS(op_name, cb_type, argc, args, arg_types, arg_va_list, meta_ops_num, vec_idx) \
+ void op_name(cb_type *cb, _UDI_ARG_LIST_##argc args ) {\
+ udi_mei_call(UDI_GCB(cb), &udi_mei_info, meta_ops_num, vec_idx, args);\
+ }\
+ void op_name##_direct(udi_op_t *op, udi_cb_t *gcb, va_lis arglist) {\
+ _UDI_MEI_VARGS##argc(args ,## arg_types ,## arg_va_list)\
+ (*(op_name##_op_t)op)(UDI_MCB(gcb, cb_type) ,## args);\
+ }\
+ void op_name##_backend(udi_op_t *op, udi_cb_t *gcb, void *marshal_space) {\
+ }
+
+#endif
+
--- /dev/null
+/**
+ * \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
--- /dev/null
+/**
+ * \file udi_meta_gio.h
+ */
+#ifndef _UDI_META_GIO_H_
+#define _UDI_META_GIO_H_
+
+typedef const struct udi_gio_provider_ops_s udi_gio_provider_ops_t;
+typedef const struct udi_gio_client_ops_s udi_gio_client_ops_t;
+typedef struct udi_gio_bind_cb_s udi_gio_bind_cb_t;
+typedef struct udi_gio_xfer_cb_s udi_gio_xfer_cb_t;
+typedef struct udi_gio_rw_params_s udi_gio_rw_params_t;
+typedef struct udi_gio_event_cb_s udi_gio_event_cb_t;
+
+typedef void udi_gio_bind_req_op_t(udi_gio_bind_cb_t *cb);
+typedef void udi_gio_unbind_req_op_t(udi_gio_bind_cb_t *cb);
+typedef void udi_gio_xfer_req_op_t(udi_gio_bind_cb_t *cb);
+typedef void udi_gio_event_res_op_t(udi_gio_bind_cb_t *cb);
+
+typedef void udi_gio_bind_ack_op_t(
+ udi_gio_bind_cb_t *cb,
+ udi_ubit32_t device_size_lo,
+ udi_ubit32_t device_size_hi,
+ udi_status_t status
+ );
+typedef void udi_gio_unbind_ack_op_t(udi_gio_bind_cb_t *cb);
+typedef void udi_gio_xfer_ack_op_t(udi_gio_bind_cb_t *cb);
+typedef void udi_gio_xfer_nak_op_t(udi_gio_bind_cb_t *cb, udi_status_t status);
+typedef void udi_gio_event_ind_op_t(udi_gio_bind_cb_t *cb);
+
+typedef udi_ubit8_t udi_gio_op_t;
+/* Limit values for udi_gio_op_t */
+#define UDI_GIO_OP_CUSTOM 16
+#define UDI_GIO_OP_MAX 64
+/* Direction flag values for op */
+#define UDI_GIO_DIR_READ (1U<<6)
+#define UDI_GIO_DIR_WRITE (1U<<7)
+/* Standard Operation Codes */
+#define UDI_GIO_OP_READ UDI_GIO_DIR_READ
+#define UDI_GIO_OP_WRITE UDI_GIO_DIR_WRITE
+
+
+
+struct udi_gio_provider_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_gio_bind_req_op_t *gio_bind_req_op;
+ udi_gio_unbind_req_op_t *gio_unbind_req_op;
+ udi_gio_xfer_req_op_t *gio_xfer_req_op;
+ udi_gio_event_res_op_t *gio_event_res_op;
+};
+/* Ops Vector Number */
+#define UDI_GIO_PROVIDER_OPS_NUM 1
+
+struct udi_gio_client_ops_s
+{
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_gio_bind_ack_op_t *gio_bind_ack_op;
+ udi_gio_unbind_ack_op_t *gio_unbind_ack_op;
+ udi_gio_xfer_ack_op_t *gio_xfer_ack_op;
+ udi_gio_xfer_nak_op_t *gio_xfer_nak_op;
+ udi_gio_event_ind_op_t *gio_event_ind_op;
+};
+/* Ops Vector Number */
+#define UDI_GIO_CLIENT_OPS_NUM 2
+
+struct udi_gio_bind_cb_s
+{
+ udi_cb_t gcb;
+ udi_xfer_constraints_t xfer_constraints;
+};
+/* Control Block Group Number */
+#define UDI_GIO_BIND_CB_NUM 1
+
+
+struct udi_gio_xfer_cb_s
+{
+ udi_cb_t gcb;
+ udi_gio_op_t op;
+ void *tr_params;
+ udi_buf_t *data_buf;
+};
+/* Control Block Group Number */
+#define UDI_GIO_XFER_CB_NUM 2
+
+struct udi_gio_rw_params_s
+{
+ udi_ubit32_t offset_lo;
+ udi_ubit32_t offset_hi;
+};
+
+struct udi_gio_event_cb_s
+{
+ udi_cb_t gcb;
+ udi_ubit8_t event_code;
+ void *event_params;
+};
+/* Control Block Group Number */
+#define UDI_GIO_EVENT_CB_NUM 3
+
+
+extern void udi_gio_bind_req(udi_gio_bind_cb_t *cb);
+extern 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
+ );
+
+extern void udi_gio_unbind_req(udi_gio_bind_cb_t *cb);
+extern void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb);
+
+extern void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb);
+extern void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb);
+extern void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status);
+
+extern void udi_gio_event_res(udi_gio_event_cb_t *cb);
+extern void udi_gio_event_ind(udi_gio_event_cb_t *cb);
+extern void udi_gio_event_res_unused(udi_gio_event_cb_t *cb);
+
+#endif
--- /dev/null
+/**
+ * \file udi_meta_mgmt.h
+ */
+#ifndef _UDI_META_MGMT_H_
+#define _UDI_META_MGMT_H_
+
+typedef struct udi_mgmt_ops_s udi_mgmt_ops_t;
+typedef struct udi_mgmt_cb_s udi_mgmt_cb_t;
+typedef struct udi_usage_cb_s udi_usage_cb_t;
+typedef struct udi_filter_element_s udi_filter_element_t;
+typedef struct udi_enumerate_cb_s udi_enumerate_cb_t;
+
+/**
+ * \name Specify Usage
+ * \{
+ */
+typedef void udi_usage_ind_op_t(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
+/* Values for resource_level */
+#define UDI_RESOURCES_CRITICAL 1
+#define UDI_RESOURCES_LOW 2
+#define UDI_RESOURCES_NORMAL 3
+#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
+#define UDI_ENUMERATE_NEXT 3
+#define UDI_ENUMERATE_NEW 4
+#define UDI_ENUMERATE_DIRECTED 5
+#define UDI_ENUMERATE_RELEASE 6
+/* Proxy */
+extern void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
+/**
+ * \}
+ */
+
+/**
+ * \name Enumeration Acknowlagement
+ * \{
+ */
+typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx);
+/* Values for enumeration_result */
+#define UDI_ENUMERATE_OK 0
+#define UDI_ENUMERATE_LEAF 1
+#define UDI_ENUMERATE_DONE 2
+#define UDI_ENUMERATE_RESCAN 3
+#define UDI_ENUMERATE_REMOVED 4
+#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);
+/**
+ * \}
+ */
+
+/**
+ * \name
+ * \{
+ */
+typedef void udi_devmgmt_req_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID);
+
+typedef void udi_devmgmt_ack_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
+/**
+ * \}
+ */
+typedef void udi_final_cleanup_req_op_t(udi_mgmt_cb_t *cb);
+typedef void udi_final_cleanup_ack_op_t(udi_mgmt_cb_t *cb);
+
+
+
+
+
+struct udi_mgmt_ops_s
+{
+ udi_usage_ind_op_t *usage_ind_op;
+ udi_enumerate_req_op_t *enumerate_req_op;
+ udi_devmgmt_req_op_t *devmgmt_req_op;
+ udi_final_cleanup_req_op_t *final_cleanup_req_op;
+};
+
+struct udi_mgmt_cb_s
+{
+ udi_cb_t gcb;
+};
+
+struct udi_usage_cb_s
+{
+ udi_cb_t gcb;
+ udi_trevent_t trace_mask;
+ udi_index_t meta_idx;
+};
+
+
+struct udi_filter_element_s
+{
+ char attr_name[UDI_MAX_ATTR_NAMELEN];
+ udi_ubit8_t attr_min[UDI_MAX_ATTR_SIZE];
+ udi_ubit8_t attr_min_len;
+ udi_ubit8_t attr_max[UDI_MAX_ATTR_SIZE];
+ udi_ubit8_t attr_max_len;
+ udi_instance_attr_type_t attr_type;
+ udi_ubit32_t attr_stride;
+};
+struct udi_enumerate_cb_s
+{
+ udi_cb_t gcb;
+ udi_ubit32_t child_ID;
+ void *child_data;
+ udi_instance_attr_list_t *attr_list;
+ udi_ubit8_t attr_valid_length;
+ const udi_filter_element_t *filter_list;
+ udi_ubit8_t filter_list_length;
+ udi_ubit8_t parent_ID;
+};
+/* Special parent_ID filter values */
+#define UDI_ANY_PARENT_ID 0
+
+/**
+ * \brief
+ */
+extern void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID );
+/**
+ * \brief Values for ::udi_devmgmt_req \a mgmt_op
+ */
+enum eDMGMT
+{
+ UDI_DMGMT_PREPARE_TO_SUSPEND = 1,
+ UDI_DMGMT_SUSPEND,
+ UDI_DMGMT_SHUTDOWN,
+ UDI_DMGMT_PARENT_SUSPENDED,
+ UDI_DMGMT_RESUME,
+ UDI_DMGMT_UNBIND
+};
+
+extern void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
+//!\brief Values for flags
+#define UDI_DMGMT_NONTRANSPARENT (1U<<0)
+//!\brief Meta-Specific Status Codes
+#define UDI_DMGMT_STAT_ROUTING_CHANGE (UDI_STAT_META_SPECIFIC|1)
+
+extern void udi_final_cleanup_req(udi_mgmt_cb_t *cb);
+extern void udi_final_cleanup_ack(udi_mgmt_cb_t *cb);
+
+
+#endif
--- /dev/null
+/**
+ * \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
+
--- /dev/null
+/**
+ * \file udi_strmem.h
+ */
+#ifndef _UDI_STRMEM_H_
+#define _UDI_STRMEM_H_
+
+/**
+ * \brief Gets the length of a C style string
+ */
+extern udi_size_t udi_strlen(const char *s);
+
+/**
+ * \brief Appends to a string
+ */
+extern char *udi_strcat(char *s1, const char *s2);
+extern char *udi_strncat(char *s1, const char *s2, udi_size_t n);
+
+/**
+ * \brief Compares Strings/Memory
+ */
+extern udi_sbit8_t udi_strcmp(const char *s1, const char *s2);
+extern udi_sbit8_t udi_strncmp(const char *s1, const char *s2, udi_size_t n);
+extern udi_sbit8_t udi_memcmp(const void *s1, const void *s2, udi_size_t n);
+
+extern char *udi_strcpy(char *s1, const char *s2);
+extern char *udi_strncpy(char *s1, const char *s2, udi_size_t n);
+extern void *udi_memcpy(void *s1, const void *s2, udi_size_t n);
+extern void *udi_memmove(void *s1, const void *s2, udi_size_t n);
+
+extern char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n);
+
+extern char *udi_strchr(const char *s, char c);
+extern char *udi_strrchr(const char *s, char c);
+extern void *udi_memchr (const void *s, udi_ubit8_t c, udi_size_t n);
+
+extern void *udi_memset(void *s, udi_ubit8_t c, udi_size_t n);
+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);
+
+
+
+#endif
--- /dev/null
+
+#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
+
--- /dev/null
+/*
+ * Acess2 UDI Environment (NIC Bindings)
+ * - By John Hodge (thePowersGang)
+ *
+ * udi_nic.h
+ * - NIC Bindings core
+ */
+#ifndef _UDI_NIC_H_
+#define _UDI_NIC_H_
+
+// === CBs ===
+#define UDI_NIC_STD_CB_NUM 1
+#define UDI_NIC_BIND_CB_NUM 2
+#define UDI_NIC_CTRL_CB_NUM 3
+#define UDI_NIC_STATUS_CB_NUM 4
+#define UDI_NIC_INFO_CB_NUM 5
+#define UDI_NIC_TX_CB_NUM 6
+#define UDI_NIC_RX_CB_NUM 7
+
+typedef struct {
+ udi_cb_t gcb;
+} udi_nic_cb_t;
+
+#define UDI_NIC_MAC_ADDRESS_SIZE 20
+// Media type
+#define UDI_NIC_ETHER 0
+#define UDI_NIC_TOKEN 1
+#define UDI_NIC_FASTETHER 2
+#define UDI_NIC_GIGETHER 3
+#define UDI_NIC_VGANYLAN 4
+#define UDI_NIC_FDDI 5
+#define UDI_NIC_ATM 6
+#define UDI_NIC_FC 7
+#define UDI_NIC_MISCMEDIA 0xff
+// capabilities
+#define UDI_NIC_CAP_TX_IP_CKSUM (1U<<0)
+#define UDI_NIC_CAP_TX_TCP_CKSUM (1U<<1)
+#define UDI_NIC_CAP_TX_UDP_CKSUM (1U<<2)
+#define UDI_NIC_CAP_MCAST_LOOPBK (1U<<3)
+#define UDI_NIC_CAP_BCAST_LOOPBK (1U<<4)
+// capabilities (requests)
+#define UDI_NIC_CAP_USE_TX_CKSUM (1U<<30)
+#define UDI_NIC_CAP_USE_RX_CKSUM (1U<<31)
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit8_t media_type;
+ udi_ubit32_t min_pdu_size;
+ udi_ubit32_t max_pdu_size;
+ udi_ubit32_t rx_hw_threshold;
+ udi_ubit32_t capabilities;
+ udi_ubit8_t max_perfect_multicast;
+ udi_ubit8_t max_total_multicast;
+ udi_ubit8_t mac_addr_len;
+ udi_ubit8_t mac_addr[UDI_NIC_MAC_ADDRESS_SIZE];
+} udi_nic_bind_cb_t;
+
+// commands
+#define UDI_NIC_ADD_MULTI 1
+#define UDI_NIC_DEL_MULTI 2
+#define UDI_NIC_ALLMULTI_ON 3
+#define UDI_NIC_ALLMULTI_OFF 4
+#define UDI_NIC_GET_CURR_MAC 5
+#define UDI_NIC_SET_CURR_MAC 6
+#define UDI_NIC_GET_FACT_MAC 7
+#define UDI_NIC_PROMISC_ON 8
+#define UDI_NIC_PROMISC_OFF 9
+#define UDI_NIC_HW_RESET 10
+#define UDI_NIC_BAD_RXPKT 11
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit8_t command;
+ udi_ubit32_t indicator;
+ udi_buf_t *data_buf;
+} udi_nic_ctrl_cb_t;
+
+// event
+#define UDI_NIC_LINK_DOWN 0
+#define UDI_NIC_LINK_UP 1
+#define UDI_NIC_LINK_RESET 2
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit8_t event;
+} udi_nic_status_cb_t;
+
+typedef struct {
+ udi_cb_t gcb;
+ udi_boolean_t interface_is_active;
+ udi_boolean_t link_is_active;
+ udi_boolean_t is_full_duplex;
+ udi_ubit32_t link_mbps;
+ udi_ubit32_t link_bps;
+ udi_ubit32_t tx_packets;
+ udi_ubit32_t rx_packets;
+ udi_ubit32_t tx_errors;
+ udi_ubit32_t rx_errors;
+ udi_ubit32_t tx_discards;
+ udi_ubit32_t rx_discards;
+ udi_ubit32_t tx_underrun;
+ udi_ubit32_t rx_overrun;
+ udi_ubit32_t collisions;
+} udi_nic_info_cb_t;
+
+typedef struct udi_nic_tx_cb_s {
+ udi_cb_t gcb;
+ struct udi_nic_tx_cb_s *chain;
+ udi_buf_t *tx_buf;
+ udi_boolean_t completion_urgent;
+} udi_nic_tx_cb_t;
+
+// rx_status
+#define UDI_NIC_RX_BADCKSUM (1U<<0)
+#define UDI_NIC_RX_UNDERRUN (1U<<1)
+#define UDI_NIC_RX_OVERRUN (1U<<2)
+#define UDI_NIC_RX_DRIBBLE (1U<<3)
+#define UDI_NIC_RX_FRAME_ERR (1U<<4)
+#define UDI_NIC_RX_MAC_ERR (1U<<5)
+#define UDI_NIC_RX_OTHER_ERR (1U<<7)
+// addr_match
+#define UDI_NIC_RX_UNKNOWN 0
+#define UDI_NIC_RX_EXACT 1
+#define UDI_NIC_RX_HASH 2
+#define UDI_NIC_RX_BROADCAST 3
+// rx_valid
+#define UDI_NIC_RX_GOOD_IP_CKSUM (1U<<0)
+#define UDI_NIC_RX_GOOD_TCP_CKSUM (1U<<1)
+#define UDI_NIC_RX_GOOD_UDP_CKSUM (1U<<2)
+typedef struct udi_nic_rx_cb_s {
+ udi_cb_t gcb;
+ struct udi_nic_rx_cb_s *chain;
+ udi_buf_t *rx_buf;
+ udi_ubit8_t rx_status;
+ udi_ubit8_t addr_match;
+ udi_ubit8_t rx_valid;
+} udi_nic_rx_cb_t;
+
+// === Function Types ===
+// - Control
+typedef void udi_nd_bind_req_op_t(udi_nic_bind_cb_t *cb, udi_index_t tx_chan_index, udi_index_t rx_chan_index);
+typedef void udi_nsr_bind_ack_op_t(udi_nic_bind_cb_t *cb, udi_status_t status);
+typedef void udi_nd_unbind_req_op_t(udi_nic_cb_t *cb);
+typedef void udi_nsr_unbind_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
+typedef void udi_nd_enable_req_op_t(udi_nic_cb_t *cb);
+typedef void udi_nsr_enable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
+typedef void udi_nd_disable_req_op_t(udi_nic_cb_t *cb);
+typedef void udi_nsr_disable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
+typedef void udi_nd_ctrl_req_op_t(udi_nic_ctrl_cb_t *cb);
+typedef void udi_nsr_ctrl_ack_op_t(udi_nic_ctrl_cb_t *cb, udi_status_t status);
+typedef void udi_nsr_status_ind_op_t(udi_nic_status_cb_t *cb);
+typedef void udi_nd_info_req_op_t(udi_nic_info_cb_t *cb, udi_boolean_t reset_statistics);
+typedef void udi_nsr_info_ack_op_t(udi_nic_info_cb_t *cb);
+// - TX
+typedef void udi_nsr_tx_rdy_op_t(udi_nic_tx_cb_t *cb);
+typedef void udi_nd_tx_req_op_t(udi_nic_tx_cb_t *cb);
+typedef void udi_nd_exp_tx_req_op_t(udi_nic_tx_cb_t *cb);
+// - RX
+typedef void udi_nsr_rx_ind_op_t(udi_nic_rx_cb_t *cb);
+typedef void udi_nsr_exp_rx_ind_op_t(udi_nic_rx_cb_t *cb);
+typedef void udi_nd_rx_rdy_op_t(udi_nic_rx_cb_t *cb);
+
+// === Functions ===
+// - Control
+extern udi_nd_bind_req_op_t udi_nd_bind_req;
+extern udi_nsr_bind_ack_op_t udi_nsr_bind_ack;
+extern udi_nd_unbind_req_op_t udi_nd_unbind_req;
+extern udi_nsr_unbind_ack_op_t udi_nsr_unbind_ack;
+extern udi_nd_enable_req_op_t udi_nd_enable_req;
+extern udi_nsr_enable_ack_op_t udi_nsr_enable_ack;
+extern udi_nd_disable_req_op_t udi_nd_disable_req;
+extern udi_nsr_disable_ack_op_t udi_nsr_disable_ack;
+extern udi_nd_ctrl_req_op_t udi_nd_ctrl_req;
+extern udi_nsr_ctrl_ack_op_t udi_nsr_ctrl_ack;
+extern udi_nsr_status_ind_op_t udi_nsr_status_ind;
+extern udi_nd_info_req_op_t udi_nd_info_req;
+extern udi_nsr_info_ack_op_t udi_nsr_info_ack;
+// - TX
+extern udi_nsr_tx_rdy_op_t udi_nsr_tx_rdy;
+extern udi_nd_tx_req_op_t udi_nd_tx_req;
+extern udi_nd_exp_tx_req_op_t udi_nd_exp_tx_req;
+// - RX
+extern udi_nsr_rx_ind_op_t udi_nsr_rx_ind;
+extern udi_nsr_exp_rx_ind_op_t udi_nsr_exp_rx_ind;
+extern udi_nd_rx_rdy_op_t udi_nd_rx_rdy;
+
+// === Op Lists ==
+#define UDI_ND_CTRL_OPS_NUM 1
+#define UDI_ND_TX_OPS_NUM 2
+#define UDI_ND_RX_OPS_NUM 3
+#define UDI_NSR_CTRL_OPS_NUM 4
+#define UDI_NSR_TX_OPS_NUM 5
+#define UDI_NSR_RX_OPS_NUM 6
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nd_bind_req_op_t *nd_bind_req_op;
+ udi_nd_unbind_req_op_t *nd_unbind_req_op;
+ udi_nd_enable_req_op_t *nd_enable_req_op;
+ udi_nd_disable_req_op_t *nd_disable_req_op;
+ udi_nd_ctrl_req_op_t *nd_ctrl_req_op;
+ udi_nd_info_req_op_t *nd_info_req_op;
+} udi_nd_ctrl_ops_t;
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nd_tx_req_op_t *nd_tx_req_op;
+ udi_nd_exp_tx_req_op_t *nd_exp_tx_req_op;
+} udi_nd_tx_ops_t;
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nd_rx_rdy_op_t *nd_rx_rdy_op;
+} udi_nd_rx_ops_t;
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nsr_bind_ack_op_t *nsr_bind_ack_op;
+ udi_nsr_unbind_ack_op_t *nsr_unbind_ack_op;
+ udi_nsr_enable_ack_op_t *nsr_enable_ack_op;
+ udi_nsr_ctrl_ack_op_t *nsr_ctrl_ack_op;
+ udi_nsr_info_ack_op_t *nsr_info_ack_op;
+ udi_nsr_status_ind_op_t *nsr_status_ind_op;
+} udi_nsr_ctrl_ops_t;
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nsr_tx_rdy_op_t *nsr_tx_rdy_op;
+} udi_nsr_tx_ops_t;
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_nsr_rx_ind_op_t *nsr_rx_ind_op;
+ udi_nsr_exp_rx_ind_op_t *nsr_exp_rx_ind_op;
+} udi_nsr_rx_ops_t;
+
+#endif
+
--- /dev/null
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ *
+ * include/udi_pci.h
+ * - PCI Bus Binding
+ */
+#ifndef _UDI_PCI_H_
+#define _UDI_PCI_H_
+
+#ifndef _UDI_PHYSIO_H_
+# error "udi_pci.h requires udi_physio.h"
+#endif
+
+#define UDI_PCI_CONFIG_SPACE 255
+#define UDI_PCI_BAR_0 0
+#define UDI_PCI_BAR_1 1
+#define UDI_PCI_BAR_2 2
+#define UDI_PCI_BAR_3 3
+#define UDI_PCI_BAR_4 4
+#define UDI_PCI_BAR_5 5
+
+#endif
+
--- /dev/null
+/**
+ * \file udi_physio.h
+ */
+#ifndef _UDI_PHYSIO_H_
+#define _UDI_PHYSIO_H_
+
+#include <udi.h>
+
+//#ifndef UDI_PHYSIO_VERSION
+//# error "UDI_PHYSIO_VERSION must be defined"
+//#endif
+
+// === TYPEDEFS ===
+// DMA Core
+typedef _udi_handle_t udi_dma_handle_t;
+#define UDI_NULL_DMA_HANDLE _NULL_HANDLE
+typedef uint64_t udi_busaddr64_t; //!< \note Opaque
+typedef struct udi_scgth_element_32_s udi_scgth_element_32_t;
+typedef struct udi_scgth_element_64_s udi_scgth_element_64_t;
+typedef struct udi_scgth_s udi_scgth_t;
+typedef _udi_handle_t udi_dma_constraints_t;
+#define UDI_NULL_DMA_CONSTRAINTS _NULL_HANDLE
+/**
+ * \name DMA constraints attributes
+ * \{
+ */
+typedef udi_ubit8_t udi_dma_constraints_attr_t;
+/* DMA Convenience Attribute Codes */
+#define UDI_DMA_ADDRESSABLE_BITS 100
+#define UDI_DMA_ALIGNMENT_BITS 101
+/* DMA Constraints on the Entire Transfer */
+#define UDI_DMA_DATA_ADDRESSABLE_BITS 110
+#define UDI_DMA_NO_PARTIAL 111
+/* DMA Constraints on the Scatter/Gather List */
+#define UDI_DMA_SCGTH_MAX_ELEMENTS 120
+#define UDI_DMA_SCGTH_FORMAT 121
+#define UDI_DMA_SCGTH_ENDIANNESS 122
+#define UDI_DMA_SCGTH_ADDRESSABLE_BITS 123
+#define UDI_DMA_SCGTH_MAX_SEGMENTS 124
+/* DMA Constraints on Scatter/Gather Segments */
+#define UDI_DMA_SCGTH_ALIGNMENT_BITS 130
+#define UDI_DMA_SCGTH_MAX_EL_PER_SEG 131
+#define UDI_DMA_SCGTH_PREFIX_BYTES 132
+/* DMA Constraints on Scatter/Gather Elements */
+#define UDI_DMA_ELEMENT_ALIGNMENT_BITS 140
+#define UDI_DMA_ELEMENT_LENGTH_BITS 141
+#define UDI_DMA_ELEMENT_GRANULARITY_BITS 142
+/* DMA Constraints for Special Addressing */
+#define UDI_DMA_ADDR_FIXED_BITS 150
+#define UDI_DMA_ADDR_FIXED_TYPE 151
+#define UDI_DMA_ADDR_FIXED_VALUE_LO 152
+#define UDI_DMA_ADDR_FIXED_VALUE_HI 153
+/* DMA Constraints on DMA Access Behavior */
+#define UDI_DMA_SEQUENTIAL 160
+#define UDI_DMA_SLOP_IN_BITS 161
+#define UDI_DMA_SLOP_OUT_BITS 162
+#define UDI_DMA_SLOP_OUT_EXTRA 163
+#define UDI_DMA_SLOP_BARRIER_BITS 164
+/* Values for UDI_DMA_SCGTH_ENDIANNESS */
+#define UDI_DMA_LITTLE_ENDIAN (1U<<6)
+#define UDI_DMA_BIG_ENDIAN (1U<<5)
+/* Values for UDI_DMA_ADDR_FIXED_TYPE */
+#define UDI_DMA_FIXED_ELEMENT 1
+/**
+ * \}
+ */
+// DMA Constraints Management
+typedef struct udi_dma_constraints_attr_spec_s udi_dma_constraints_attr_spec_t;
+typedef void udi_dma_constraints_attr_set_call_t(
+ udi_cb_t *gcb, udi_dma_constraints_t new_constraints, udi_status_t status
+ );
+typedef struct udi_dma_limits_s udi_dma_limits_t;
+
+
+// === STRUCTURES ===
+// --- DMA Constraints Management ---
+struct udi_dma_constraints_attr_spec_s
+{
+ udi_dma_constraints_attr_t attr_type;
+ udi_ubit32_t attr_value;
+};
+// --- DMA Core ---
+struct udi_dma_limits_s
+{
+ udi_size_t max_legal_contig_alloc;
+ udi_size_t max_safe_contig_alloc;
+ udi_size_t cache_line_size;
+};
+struct udi_scgth_element_32_s
+{
+ udi_ubit32_t block_busaddr;
+ udi_ubit32_t block_length;
+};
+struct udi_scgth_element_64_s
+{
+ udi_busaddr64_t block_busaddr;
+ udi_ubit32_t block_length;
+ udi_ubit32_t el_reserved;
+};
+/* Extension Flag */
+#define UDI_SCGTH_EXT 0x80000000
+struct udi_scgth_s
+{
+ udi_ubit16_t scgth_num_elements;
+ udi_ubit8_t scgth_format;
+ udi_boolean_t scgth_must_swap;
+ union {
+ udi_scgth_element_32_t *el32p;
+ udi_scgth_element_64_t *el64p;
+ } scgth_elements;
+ union {
+ udi_scgth_element_32_t el32;
+ udi_scgth_element_64_t el64;
+ } scgth_first_segment;
+};
+/* Values for scgth_format */
+#define UDI_SCGTH_32 (1U<<0)
+#define UDI_SCGTH_64 (1U<<1)
+#define UDI_SCGTH_DMA_MAPPED (1U<<6)
+#define UDI_SCGTH_DRIVER_MAPPED (1U<<7)
+
+
+
+// === FUNCTIONS ===
+#include <physio/dma_const.h>
+#include <physio/dma.h>
+#include <physio/meta_intr.h>
+#include <physio/meta_bus.h>
+#include "physio/pio.h"
+
+#include "physio/pci.h"
+
+#endif
--- /dev/null
+/**
+ * \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
+