Modules/UDI - Working on more framework and PCI bus
[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         enum {
38                 UDI_REGIONTYPE_NORMAL,
39                 UDI_REGIONTYPE_FP,
40         }       Type;
41         enum {
42                 UDI_REGIONBINDING_STATIC,
43                 UDI_REGIONBINDING_DYNAMIC,
44         }       Binding;
45         enum {
46                 UDI_REGIONPRIO_MED,
47                 UDI_REGIONPRIO_LO,
48                 UDI_REGIONPRIO_HI,
49         }       Priority;
50         enum {
51                 UDI_REGIONLATENCY_NONOVERRRUNABLE,
52                 UDI_REGIONLATENCY_POWERFAIL,
53                 UDI_REGIONLATENCY_OVERRUNNABLE,
54                 UDI_REGIONLATENCY_RETRYABLE,
55                 // non_overrunable
56                 UDI_REGIONLATENCY_NONCTRITICAL,
57         }       Latency;
58         udi_ubit32_t    OverrunTime;
59
60
61 };
62
63 struct sUDI_MetaLang
64 {
65         const char *Name;
66          int    nOpGroups;
67         struct {
68                 void    *OpList;
69         } OpGroups;
70 };
71
72 struct sUDI_MetaLangRef
73 {
74         udi_ubit8_t     meta_idx;
75         const char      *interface_name;
76         tUDI_MetaLang   *metalang;
77         // TODO: pointer to metalanguage structure
78 };
79
80 struct sUDI_BindOps
81 {
82         udi_ubit8_t     meta_idx;
83         udi_ubit8_t     region_idx;
84         udi_ubit8_t     ops_idx;
85         udi_ubit8_t     bind_cb_idx;
86 };
87
88 struct sUDI_DriverModule
89 {
90         tUDI_DriverModule       *Next;
91         void    *Base;
92
93         udi_init_t      *InitInfo;
94
95         // Counts of arrays in InitInfo
96          int    nCBInit;
97          int    nOpsInit;
98                 
99         const char      *ModuleName;
100          int    nMessages;
101         tUDI_PropMessage        *Messages;      // Sorted list
102         
103          int    nRegionTypes;
104         tUDI_PropRegion *RegionTypes;
105
106          int    nMetaLangs;
107         tUDI_MetaLangRef        *MetaLangs;
108
109          int    nParents;
110         tUDI_BindOps    *Parents;
111          int    nRegions;
112 };
113
114 struct sUDI_DriverInstance
115 {
116         tUDI_DriverModule       *Module;
117         udi_channel_t   ManagementChannel;
118         tUDI_DriverRegion       *Regions[];
119 };
120
121 struct sUDI_DriverRegion
122 {
123         udi_init_context_t      *InitContext;
124 };
125
126
127 extern tUDI_MetaLang    cMetaLang_Management;
128
129
130 // --- Index to pointer translation ---
131 extern udi_ops_init_t   *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
132 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverInstance *Inst, udi_index_t meta_idx);
133
134 // --- Channels ---
135 extern udi_channel_t    UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
136 extern int      UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, udi_index_t meta_ops_num, void *context, const void *ops);
137 extern int      UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region);
138 extern const void       *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
139 extern void     UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
140
141 // --- Async Calls ---
142 typedef struct sUDI_DeferredCall        tUDI_DeferredCall;
143 typedef void    tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
144 struct sUDI_DeferredCall
145 {
146         struct sUDI_DeferredCall        *Next;
147         tUDI_DeferredUnmarshal  *Unmarshal;
148         udi_op_t        *Handler;
149         // ...
150 };
151 extern void     UDI_int_AddDeferred(tUDI_DeferredCall *Call);
152 extern void     UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
153 extern void     UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
154 extern void     UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
155
156 // --- CBs ---
157 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
158
159
160 #endif
161

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