Usermode/libc++ - Implement map::insert and map::erase
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / physio / meta_bus.c
1 /**
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * udi_lib/physio/meta_bus.c
6  * - Bus Bridge Metalanguage
7  */
8 #define DEBUG   1
9 #include <udi.h>
10 #include <udi_physio.h>
11 #include <acess.h>
12 #include <udi_internal.h>
13
14 #define udi_mei_info    udi_meta_info__bridge
15
16 extern tUDI_MetaLang    cMetaLang_BusBridge;
17 extern udi_mei_init_t   udi_meta_info__bridge;
18
19 // === EXPORTS ===
20 EXPORT(udi_bus_bind_req);
21 EXPORT(udi_bus_bind_ack);
22 EXPORT(udi_bus_unbind_req);
23 EXPORT(udi_bus_unbind_ack);
24 EXPORT(udi_intr_attach_req);
25 EXPORT(udi_intr_attach_ack);
26 EXPORT(udi_intr_attach_ack_unused);
27 EXPORT(udi_intr_detach_req);
28 EXPORT(udi_intr_detach_ack);
29 EXPORT(udi_intr_detach_ack_unused);
30 EXPORT(udi_intr_event_ind);
31 EXPORT(udi_intr_event_rdy);
32
33 #define PREP_OPS(type,ml,num)   const type *ops = UDI_int_ChannelPrepForCall(UDI_GCB(cb), ml, num); \
34         if(!ops) { Log_Warning("UDI", "%s on wrong channel type", __func__); return ; }
35
36 #define PREP_OPS_DEVICE const udi_bus_device_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_BusBridge, UDI_BUS_DEVICE_OPS_NUM ); \
37         if(!ops) { Log_Warning("UDI", "%s on wrong channel type", __func__); return ; }
38
39 // === CODE ===
40 UDI_MEI_STUBS(udi_bus_bind_ack, udi_bus_bind_cb_t, 3,
41         (dma_constraints,       preferred_endianness, status      ),
42         (udi_dma_constraints_t, udi_ubit8_t,          udi_status_t),
43         (UDI_VA_POINTER,        UDI_VA_UBIT8_T,       UDI_VA_STATUS_T),
44         UDI_BUS_DEVICE_OPS_NUM, 1)
45 UDI_MEI_STUBS(udi_bus_unbind_ack, udi_bus_bind_cb_t, 0,
46         (), (), (),
47         UDI_BUS_DEVICE_OPS_NUM, 2)
48 UDI_MEI_STUBS(udi_intr_attach_ack, udi_intr_attach_cb_t, 1,
49         (status), (udi_status_t), (UDI_VA_STATUS_T),
50         UDI_BUS_DEVICE_OPS_NUM, 3)
51 void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
52 {
53         Log_Error("UDI", "Driver %s caused %s to be called",
54                 UDI_int_ChannelGetInstance(UDI_GCB(intr_attach_cb), false, NULL)->Module->ModuleName,
55                 __func__);
56 }
57 UDI_MEI_STUBS(udi_intr_detach_ack, udi_intr_detach_cb_t, 0,
58         (), (), (),
59         UDI_BUS_DEVICE_OPS_NUM, 4)
60 void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
61 {
62         Log_Error("UDI", "Driver %s caused %s to be called",
63                 UDI_int_ChannelGetInstance(UDI_GCB(intr_detach_cb), false, NULL)->Module->ModuleName,
64                 __func__);
65 }
66
67 UDI_MEI_STUBS(udi_bus_bind_req, udi_bus_bind_cb_t, 0,
68         (), (), (),
69         UDI_BUS_BRIDGE_OPS_NUM, 1)
70 UDI_MEI_STUBS(udi_bus_unbind_req, udi_bus_bind_cb_t, 0,
71         (), (), (),
72         UDI_BUS_BRIDGE_OPS_NUM, 2)
73 UDI_MEI_STUBS(udi_intr_attach_req, udi_intr_attach_cb_t, 0,
74         (), (), (),
75         UDI_BUS_BRIDGE_OPS_NUM, 3)
76 UDI_MEI_STUBS(udi_intr_detach_req, udi_intr_detach_cb_t, 0,
77         (), (), (),
78         UDI_BUS_BRIDGE_OPS_NUM, 4)
79
80 UDI_MEI_STUBS(udi_intr_event_rdy, udi_intr_event_cb_t, 0,
81         (), (), (),
82         UDI_BUS_INTR_DISPATCH_OPS_NUM, 1)
83 UDI_MEI_STUBS(udi_intr_event_ind, udi_intr_event_cb_t, 1,
84         (flags), (udi_ubit8_t), (UDI_VA_UBIT8_T),
85         UDI_BUS_INTR_HANDLER_OPS_NUM, 1)
86
87
88 // === GLOBALS ==
89 udi_layout_t    _BUS_BIND_cb_layout[] = {
90         UDI_DL_END
91 };
92 udi_layout_t    _BUS_INTR_ATTACH_cb_layout[] = {
93         UDI_DL_STATUS_T,
94         UDI_DL_UBIT8_T,
95         UDI_DL_PIO_HANDLE_T,
96         UDI_DL_END
97 };
98 udi_layout_t    _BUS_INTR_DETACH_cb_layout[] = {
99         UDI_DL_INDEX_T,
100         UDI_DL_END
101 };
102 udi_layout_t    _BUS_INTR_EVENT_cb_layout[] = {
103         UDI_DL_BUF,
104                 0,0,0,
105         UDI_DL_UBIT16_T,
106         UDI_DL_END
107 };
108
109 static const udi_layout_t       _noargs_marshal[] = {
110         UDI_DL_END
111 };
112 #define _udi_bus_bind_req_marshal_layout        _noargs_marshal
113 #define _udi_bus_unbind_req_marshal_layout      _noargs_marshal
114 #define _udi_intr_attach_req_marshal_layout     _noargs_marshal
115 #define _udi_intr_detach_req_marshal_layout     _noargs_marshal
116 const udi_layout_t      _udi_bus_bind_ack_marshal_layout[] = {
117         UDI_DL_DMA_CONSTRAINTS_T,
118         UDI_DL_UBIT8_T,
119         UDI_DL_STATUS_T,
120         UDI_DL_END
121 };
122 #define _udi_bus_unbind_ack_marshal_layout      _noargs_marshal
123 const udi_layout_t      _udi_intr_attach_ack_marshal_layout[] = {
124         UDI_DL_STATUS_T,
125         UDI_DL_END
126 };
127 #define _udi_intr_detach_ack_marshal_layout     _noargs_marshal
128 #define _udi_intr_event_rdy_marshal_layout      _noargs_marshal
129 const udi_layout_t      _udi_intr_event_ind_marshal_layout[] = {
130         UDI_DL_UBIT8_T,
131         UDI_DL_END
132 };
133
134 #define UDI__OPS_NUM    0
135 #define MEI_OPINFO(name,cat,flags,cbtype,rsp_ops,rsp_idx,err_ops,err_idx)       \
136         {#name, UDI_MEI_OPCAT_##cat,flags,UDI_##cbtype##_CB_NUM, \
137                 UDI_##rsp_ops##_OPS_NUM,rsp_idx,UDI_##err_ops##_OPS_NUM,err_idx, \
138                 name##_direct, name##_backend, _##cbtype##_cb_layout, _##name##_marshal_layout }
139
140 udi_mei_op_template_t   udi_meta_info__bridge__bus_ops[] = {
141         MEI_OPINFO(udi_bus_bind_req, REQ, 0, BUS_BIND, BUS_DEVICE,1, ,0),
142         MEI_OPINFO(udi_bus_unbind_req, REQ, 0, BUS_BIND, BUS_DEVICE,2, ,0),
143         MEI_OPINFO(udi_intr_attach_req, REQ, 0, BUS_INTR_ATTACH, BUS_DEVICE,3, ,0),
144         MEI_OPINFO(udi_intr_detach_req, REQ, 0, BUS_INTR_DETACH, BUS_DEVICE,4, ,0),
145         {0}
146 };
147 udi_mei_op_template_t   udi_meta_info__bridge__device_ops[] = {
148         MEI_OPINFO(udi_bus_bind_ack, ACK, 0, BUS_BIND, ,0, ,0),
149         MEI_OPINFO(udi_bus_unbind_ack, ACK, 0, BUS_BIND, ,0, ,0),
150         MEI_OPINFO(udi_intr_attach_ack, ACK, 0, BUS_INTR_ATTACH, ,0, ,0),
151         MEI_OPINFO(udi_intr_detach_ack, ACK, 0, BUS_INTR_DETACH, ,0, ,0),
152         {0}
153 };
154 udi_mei_op_template_t   udi_meta_info__bridge__intr_disp_ops[] = {
155         MEI_OPINFO(udi_intr_event_rdy, RDY, 0, BUS_INTR_EVENT, ,0, ,0),
156         {0}
157 };
158 udi_mei_op_template_t   udi_meta_info__bridge__intr_hdlr_ops[] = {
159         MEI_OPINFO(udi_intr_event_ind, IND, 0, BUS_INTR_EVENT, ,0, ,0),
160         {0}
161 };
162 udi_mei_ops_vec_template_t      udi_meta_info__bridge_ops[] = {
163         {UDI_BUS_BRIDGE_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR|UDI_MEI_REL_BIND, udi_meta_info__bridge__bus_ops},
164         {UDI_BUS_DEVICE_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND, udi_meta_info__bridge__device_ops},
165         {UDI_BUS_INTR_DISPATCH_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR, udi_meta_info__bridge__intr_disp_ops},
166         {UDI_BUS_INTR_HANDLER_OPS_NUM, UDI_MEI_REL_EXTERNAL, udi_meta_info__bridge__intr_hdlr_ops},
167         {0}
168 };
169 udi_mei_init_t  udi_meta_info__bridge = {
170         udi_meta_info__bridge_ops,
171         NULL
172 };
173 tUDI_MetaLang   cMetaLang_BusBridge = {
174         "udi_bridge",
175         &udi_meta_info__bridge,
176         // CB Types
177         5,
178         {
179                 {0},    // 0: Empty
180                 {sizeof(udi_bus_bind_cb_t),    0, _BUS_BIND_cb_layout},
181                 {sizeof(udi_intr_attach_cb_t), 0, _BUS_INTR_ATTACH_cb_layout},
182                 {sizeof(udi_intr_detach_cb_t), 0, _BUS_INTR_DETACH_cb_layout},
183                 {sizeof(udi_intr_event_cb_t),  0, _BUS_INTR_EVENT_cb_layout}
184         }
185 };

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