Modules/UDI - MEI working, used for nic
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / include / udi_internal.h
1 /*
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * udi_internal.h
6  * - Definitions for opaque structures
7  */
8 #ifndef _UDI_INTERNAL_H_
9 #define _UDI_INTERNAL_H_
10
11 #include <stdbool.h>
12 #include <stdarg.h>
13
14 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
15 #define NEW_wA(type,fld,cnt)    NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
16
17 typedef struct sUDI_PropMessage         tUDI_PropMessage;
18 typedef struct sUDI_PropRegion  tUDI_PropRegion;
19 typedef struct sUDI_PropDevSpec tUDI_PropDevSpec;
20
21 typedef const struct sUDI_MetaLang      tUDI_MetaLang;
22
23 typedef struct sUDI_MetaLangRef         tUDI_MetaLangRef;
24 typedef struct sUDI_BindOps     tUDI_BindOps;
25
26 typedef struct sUDI_DriverModule        tUDI_DriverModule;
27 typedef struct sUDI_DriverInstance      tUDI_DriverInstance;
28 typedef struct sUDI_DriverRegion        tUDI_DriverRegion;
29
30 typedef struct sUDI_ChildBinding        tUDI_ChildBinding;
31
32 struct sUDI_PropMessage
33 {
34          int    locale;
35         udi_ubit16_t    index;
36         const char      *string;
37 };
38
39 struct sUDI_PropRegion
40 {
41         udi_index_t     RegionIdx;
42         enum {
43                 UDI_REGIONTYPE_NORMAL,
44                 UDI_REGIONTYPE_FP,
45         }       Type;
46         enum {
47                 UDI_REGIONBINDING_STATIC,
48                 UDI_REGIONBINDING_DYNAMIC,
49         }       Binding;
50         enum {
51                 UDI_REGIONPRIO_MED,
52                 UDI_REGIONPRIO_LO,
53                 UDI_REGIONPRIO_HI,
54         }       Priority;
55         enum {
56                 UDI_REGIONLATENCY_NONOVERRRUNABLE,
57                 UDI_REGIONLATENCY_POWERFAIL,
58                 UDI_REGIONLATENCY_OVERRUNNABLE,
59                 UDI_REGIONLATENCY_RETRYABLE,
60                 // non_overrunable
61                 UDI_REGIONLATENCY_NONCTRITICAL,
62         }       Latency;
63         udi_ubit32_t    OverrunTime;
64
65         udi_index_t     BindMeta;
66         udi_index_t     PriBindOps;
67         udi_index_t     SecBindOps;
68         udi_index_t     BindCb;
69 };
70
71 struct sUDI_MetaLang
72 {
73         const char *Name;
74         //void  *MeiInfo;
75          int    nCbTypes;
76         struct {
77                 udi_size_t      Size;
78                 udi_layout_t    *Layout;
79         } CbTypes[];
80 };
81
82 struct sUDI_MetaLangRef
83 {
84         udi_ubit8_t     meta_idx;
85         const char      *interface_name;
86         tUDI_MetaLang   *metalang;
87         // TODO: pointer to metalanguage structure
88 };
89
90 struct sUDI_BindOps
91 {
92         udi_ubit8_t     meta_idx;
93         udi_ubit8_t     region_idx;
94         udi_ubit8_t     ops_idx;
95         udi_ubit8_t     bind_cb_idx;
96 };
97
98 struct sUDI_PropDevSpec
99 {
100          int    MessageNum;
101         udi_ubit8_t     MetaIdx;
102         tUDI_MetaLang   *Metalang;
103          int    nAttribs;
104         udi_instance_attr_list_t        Attribs[];
105 };
106
107 struct sUDI_DriverModule
108 {
109         tUDI_DriverModule       *Next;
110         void    *Base;
111
112         const udi_init_t        *InitInfo;
113
114         // Counts of arrays in InitInfo
115          int    nCBInit;
116          int    nOpsInit;
117                 
118         const char      *ModuleName;
119          int    nMessages;
120         tUDI_PropMessage        *Messages;      // Sorted list
121         
122          int    nRegionTypes;
123         tUDI_PropRegion *RegionTypes;
124
125          int    nMetaLangs;
126         tUDI_MetaLangRef        *MetaLangs;
127
128          int    nParents;
129         tUDI_BindOps    *Parents;
130         
131          int    nChildBindOps;
132         tUDI_BindOps    *ChildBindOps;
133
134          int    nDevices;
135         tUDI_PropDevSpec        **Devices;
136
137          int    nRegions;
138 };
139
140 struct sUDI_DriverInstance
141 {
142         struct sUDI_DriverInstance      *Next;
143         tUDI_DriverModule       *Module;
144         udi_channel_t   ManagementChannel;
145         tUDI_DriverInstance     *Parent;
146         tUDI_ChildBinding       *ParentChildBinding;
147
148          int    CurState;       // Current MA state
149         
150         tUDI_ChildBinding       *FirstChild;
151         tUDI_DriverRegion       *Regions[];
152 };
153
154 struct sUDI_DriverRegion
155 {
156         udi_init_context_t      *InitContext;
157 };
158
159 struct sUDI_ChildBinding
160 {
161         tUDI_ChildBinding       *Next;
162         
163         udi_ubit32_t    ChildID;
164         tUDI_MetaLang   *Metalang;
165         tUDI_BindOps    *BindOps;
166         
167         udi_ops_init_t  *Ops;
168         tUDI_DriverInstance     *BoundInstance;
169         
170          int    nAttribs;
171         udi_instance_attr_list_t        Attribs[];
172 };
173
174 // --- Metalanguages ---
175 extern tUDI_MetaLang    cMetaLang_Management;
176
177 // --- Index to pointer translation ---
178 extern udi_ops_init_t   *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
179 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverModule *Inst, udi_index_t meta_idx);
180
181 // --- Channels ---
182 extern udi_channel_t    UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
183 extern udi_channel_t    UDI_CreateChannel_Linked(udi_channel_t orig, udi_ubit8_t spawn_idx);
184 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);
185 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);
186 extern tUDI_DriverInstance      *UDI_int_ChannelGetInstance(udi_cb_t *gcb, bool other_side, udi_index_t *region_idx);
187 extern void     UDI_int_ChannelSetContext(udi_channel_t channel, void *context);
188 extern const void       *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
189 extern void     UDI_int_ChannelFlip(udi_cb_t *gcb);
190 extern void     UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
191
192 // --- Async Calls ---
193 typedef struct sUDI_DeferredCall        tUDI_DeferredCall;
194 typedef void    tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
195 struct sUDI_DeferredCall
196 {
197         struct sUDI_DeferredCall        *Next;
198         tUDI_DeferredUnmarshal  *Unmarshal;
199         udi_cb_t        *cb;
200         udi_op_t        *Handler;
201         // ...
202 };
203 extern void     UDI_int_DeferredThread(void *unused);   // Worker started by main.c
204 extern void     UDI_int_AddDeferred(tUDI_DeferredCall *Call);
205 extern void     UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
206
207 extern void     UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
208 extern void     UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
209
210 // --- CBs ---
211 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
212 extern udi_cb_t *udi_cb_alloc_internal_v(tUDI_MetaLang *Meta, udi_index_t MetaCBNum, size_t inline_size, size_t scratch_size, udi_channel_t channel);
213 extern tUDI_MetaLang    *UDI_int_GetCbType(udi_cb_t *gcb, udi_index_t *meta_cb_num);
214
215 // --- Attribute Management ---
216 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);
217
218 // --- Layout ---
219 extern size_t   _udi_marshal_values(void *buf, udi_layout_t *layout, va_list values);
220
221 #endif
222

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