Modules/UDI - Attributes, PIO, CB allocation and channel_spawn
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_internal.h
index 3b49225..9cc835a 100644 (file)
@@ -8,16 +8,26 @@
 #ifndef _UDI_INTERNAL_H_
 #define _UDI_INTERNAL_H_
 
+#include <stdbool.h>
+
 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
 #define NEW_wA(type,fld,cnt)   NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
 
 typedef struct sUDI_PropMessage        tUDI_PropMessage;
 typedef struct sUDI_PropRegion         tUDI_PropRegion;
+typedef struct sUDI_PropDevSpec        tUDI_PropDevSpec;
+
+typedef const struct sUDI_MetaLang     tUDI_MetaLang;
+
+typedef struct sUDI_MetaLangRef        tUDI_MetaLangRef;
+typedef struct sUDI_BindOps    tUDI_BindOps;
 
 typedef struct sUDI_DriverModule       tUDI_DriverModule;
 typedef struct sUDI_DriverInstance     tUDI_DriverInstance;
 typedef struct sUDI_DriverRegion       tUDI_DriverRegion;
 
+typedef struct sUDI_ChildBinding       tUDI_ChildBinding;
+
 struct sUDI_PropMessage
 {
         int    locale;
@@ -27,6 +37,7 @@ struct sUDI_PropMessage
 
 struct sUDI_PropRegion
 {
+       udi_index_t     RegionIdx;
        enum {
                UDI_REGIONTYPE_NORMAL,
                UDI_REGIONTYPE_FP,
@@ -50,7 +61,45 @@ struct sUDI_PropRegion
        }       Latency;
        udi_ubit32_t    OverrunTime;
 
+       udi_index_t     BindMeta;
+       udi_index_t     PriBindOps;
+       udi_index_t     SecBindOps;
+       udi_index_t     BindCb;
+};
+
+struct sUDI_MetaLang
+{
+       const char *Name;
+        int    nCbTypes;
+       struct {
+               udi_size_t      Size;
+               udi_layout_t    *Layout;
+       } CbTypes[];
+};
+
+struct sUDI_MetaLangRef
+{
+       udi_ubit8_t     meta_idx;
+       const char      *interface_name;
+       tUDI_MetaLang   *metalang;
+       // TODO: pointer to metalanguage structure
+};
 
+struct sUDI_BindOps
+{
+       udi_ubit8_t     meta_idx;
+       udi_ubit8_t     region_idx;
+       udi_ubit8_t     ops_idx;
+       udi_ubit8_t     bind_cb_idx;
+};
+
+struct sUDI_PropDevSpec
+{
+        int    MessageNum;
+       udi_ubit8_t     MetaIdx;
+       tUDI_MetaLang   *Metalang;
+        int    nAttribs;
+       udi_instance_attr_list_t        Attribs[];
 };
 
 struct sUDI_DriverModule
@@ -59,6 +108,10 @@ struct sUDI_DriverModule
        void    *Base;
 
        udi_init_t      *InitInfo;
+
+       // Counts of arrays in InitInfo
+        int    nCBInit;
+        int    nOpsInit;
                
        const char      *ModuleName;
         int    nMessages;
@@ -66,14 +119,31 @@ struct sUDI_DriverModule
        
         int    nRegionTypes;
        tUDI_PropRegion *RegionTypes;
+
+        int    nMetaLangs;
+       tUDI_MetaLangRef        *MetaLangs;
+
+        int    nParents;
+       tUDI_BindOps    *Parents;
        
-        int    nSecondaryRegions;
+        int    nChildBindOps;
+       tUDI_BindOps    *ChildBindOps;
+
+        int    nDevices;
+       tUDI_PropDevSpec        **Devices;
+
+        int    nRegions;
 };
 
 struct sUDI_DriverInstance
 {
+       struct sUDI_DriverInstance      *Next;
        tUDI_DriverModule       *Module;
        udi_channel_t   ManagementChannel;
+       tUDI_DriverInstance     *Parent;
+       tUDI_ChildBinding       *ParentChildBinding;
+       
+       tUDI_ChildBinding       *FirstChild;
        tUDI_DriverRegion       *Regions[];
 };
 
@@ -82,17 +152,62 @@ struct sUDI_DriverRegion
        udi_init_context_t      *InitContext;
 };
 
-enum eUDI_MetaLang
+struct sUDI_ChildBinding
+{
+       tUDI_ChildBinding       *Next;
+       
+       udi_ubit32_t    ChildID;
+       tUDI_MetaLang   *Metalang;
+       tUDI_BindOps    *BindOps;
+       
+       udi_ops_init_t  *Ops;
+       tUDI_DriverInstance     *BoundInstance;
+       
+        int    nAttribs;
+       udi_instance_attr_list_t        Attribs[];
+};
+
+// --- Metalanguages ---
+extern tUDI_MetaLang   cMetaLang_Management;
+
+
+// --- Index to pointer translation ---
+extern udi_ops_init_t  *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
+extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverInstance *Inst, udi_index_t meta_idx);
+
+// --- Channels ---
+extern udi_channel_t   UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
+extern udi_channel_t   UDI_CreateChannel_Linked(udi_channel_t orig, udi_ubit8_t spawn_idx);
+extern int     UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t region_idx, udi_index_t meta_ops_num,  void *context, const void *ops);
+extern int     UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region, void *context, bool is_child_bind, udi_ubit32_t child_ID);
+extern tUDI_DriverInstance     *UDI_int_ChannelGetInstance(udi_cb_t *gcb, bool other_side, udi_index_t *region_idx);
+extern void    UDI_int_ChannelSetContext(udi_channel_t channel, void *context);
+extern const void      *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
+extern void    UDI_int_ChannelFlip(udi_cb_t *gcb);
+extern void    UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
+
+// --- Async Calls ---
+typedef struct sUDI_DeferredCall       tUDI_DeferredCall;
+typedef void   tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
+struct sUDI_DeferredCall
 {
-       METALANG_MGMT,
-       METALANG_BUS
+       struct sUDI_DeferredCall        *Next;
+       tUDI_DeferredUnmarshal  *Unmarshal;
+       udi_cb_t        *cb;
+       udi_op_t        *Handler;
+       // ...
 };
+extern void    UDI_int_DeferredThread(void *unused);   // Worker started by main.c
+extern void    UDI_int_AddDeferred(tUDI_DeferredCall *Call);
+extern void    UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
+extern void    UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
+extern void    UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
 
-extern udi_channel_t   UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
-       tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
-       tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex);
+// --- CBs ---
+extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
 
-extern const void      *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang);
+// --- Attribute Management ---
+extern udi_instance_attr_type_t udi_instance_attr_get_internal(udi_cb_t *gcb, const char *attr_name, udi_ubit32_t child_ID, void *attr_value, udi_size_t attr_length, udi_size_t *actual_length);
 
 #endif
 

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