Modules/UDI - Improved attribute parsing
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / 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
13 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
14 #define NEW_wA(type,fld,cnt)    NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
15
16 typedef struct sUDI_PropMessage         tUDI_PropMessage;
17 typedef struct sUDI_PropRegion  tUDI_PropRegion;
18
19 typedef const struct sUDI_MetaLang      tUDI_MetaLang;
20
21 typedef struct sUDI_MetaLangRef         tUDI_MetaLangRef;
22 typedef struct sUDI_BindOps     tUDI_BindOps;
23
24 typedef struct sUDI_DriverModule        tUDI_DriverModule;
25 typedef struct sUDI_DriverInstance      tUDI_DriverInstance;
26 typedef struct sUDI_DriverRegion        tUDI_DriverRegion;
27
28 struct sUDI_PropMessage
29 {
30          int    locale;
31         udi_ubit16_t    index;
32         const char      *string;
33 };
34
35 struct sUDI_PropRegion
36 {
37         udi_index_t     RegionIdx;
38         enum {
39                 UDI_REGIONTYPE_NORMAL,
40                 UDI_REGIONTYPE_FP,
41         }       Type;
42         enum {
43                 UDI_REGIONBINDING_STATIC,
44                 UDI_REGIONBINDING_DYNAMIC,
45         }       Binding;
46         enum {
47                 UDI_REGIONPRIO_MED,
48                 UDI_REGIONPRIO_LO,
49                 UDI_REGIONPRIO_HI,
50         }       Priority;
51         enum {
52                 UDI_REGIONLATENCY_NONOVERRRUNABLE,
53                 UDI_REGIONLATENCY_POWERFAIL,
54                 UDI_REGIONLATENCY_OVERRUNNABLE,
55                 UDI_REGIONLATENCY_RETRYABLE,
56                 // non_overrunable
57                 UDI_REGIONLATENCY_NONCTRITICAL,
58         }       Latency;
59         udi_ubit32_t    OverrunTime;
60
61         udi_index_t     BindMeta;
62         udi_index_t     PriBindOps;
63         udi_index_t     SecBindOps;
64         udi_index_t     BindCb;
65 };
66
67 struct sUDI_MetaLang
68 {
69         const char *Name;
70          int    nOpGroups;
71         struct {
72                 void    *OpList;
73         } OpGroups;
74 };
75
76 struct sUDI_MetaLangRef
77 {
78         udi_ubit8_t     meta_idx;
79         const char      *interface_name;
80         tUDI_MetaLang   *metalang;
81         // TODO: pointer to metalanguage structure
82 };
83
84 struct sUDI_BindOps
85 {
86         udi_ubit8_t     meta_idx;
87         udi_ubit8_t     region_idx;
88         udi_ubit8_t     ops_idx;
89         udi_ubit8_t     bind_cb_idx;
90 };
91
92 struct sUDI_PropDevSpec
93 {
94         
95 };
96
97 struct sUDI_DriverModule
98 {
99         tUDI_DriverModule       *Next;
100         void    *Base;
101
102         udi_init_t      *InitInfo;
103
104         // Counts of arrays in InitInfo
105          int    nCBInit;
106          int    nOpsInit;
107                 
108         const char      *ModuleName;
109          int    nMessages;
110         tUDI_PropMessage        *Messages;      // Sorted list
111         
112          int    nRegionTypes;
113         tUDI_PropRegion *RegionTypes;
114
115          int    nMetaLangs;
116         tUDI_MetaLangRef        *MetaLangs;
117
118          int    nParents;
119         tUDI_BindOps    *Parents;
120          int    nRegions;
121 };
122
123 struct sUDI_DriverInstance
124 {
125         tUDI_DriverModule       *Module;
126         udi_channel_t   ManagementChannel;
127         tUDI_DriverRegion       *Regions[];
128 };
129
130 struct sUDI_DriverRegion
131 {
132         udi_init_context_t      *InitContext;
133 };
134
135
136 extern tUDI_MetaLang    cMetaLang_Management;
137
138
139 // --- Index to pointer translation ---
140 extern udi_ops_init_t   *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
141 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverInstance *Inst, udi_index_t meta_idx);
142
143 // --- Channels ---
144 extern udi_channel_t    UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
145 extern int      UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, udi_index_t meta_ops_num, void *context, const void *ops);
146 extern int      UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region);
147 extern const void       *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
148 extern void     UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
149
150 // --- Async Calls ---
151 typedef struct sUDI_DeferredCall        tUDI_DeferredCall;
152 typedef void    tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
153 struct sUDI_DeferredCall
154 {
155         struct sUDI_DeferredCall        *Next;
156         tUDI_DeferredUnmarshal  *Unmarshal;
157         udi_op_t        *Handler;
158         // ...
159 };
160 extern void     UDI_int_AddDeferred(tUDI_DeferredCall *Call);
161 extern void     UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
162 extern void     UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
163 extern void     UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
164
165 // --- CBs ---
166 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
167
168
169 #endif
170

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