Module/UDI - Implementing parts of MEI (abusing CPP for fun and profit)
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / physio / meta_bus.c
index c0631f2..1aed3ab 100644 (file)
 #include <udi_physio.h>
 #include "../../udi_internal.h"
 
-// === GLOBALS ==
-udi_layout_t   cMetaLang_BusBridge_IntrAttachCbLayout[] = {
-       UDI_DL_STATUS_T,
-       UDI_DL_UBIT8_T,
-       UDI_DL_ORIGIN_T,        // TODO: handle
-       0
-};
-tUDI_MetaLang  cMetaLang_BusBridge = {
-       "udi_bridge",
-       // CB Types
-       5,
-       {
-               {0},    // 0: Empty
-               {sizeof(udi_bus_bind_cb_t), NULL},      // Defined, but is just a gcb
-               {sizeof(udi_intr_attach_cb_t), NULL},
-               {sizeof(udi_intr_detach_cb_t), NULL},
-               {sizeof(udi_intr_event_cb_t), NULL}
-       }
-};
+#define USE_MEI        0
+
+#define udi_mei_info   udi_meta_info__bridge
+
+extern tUDI_MetaLang   cMetaLang_BusBridge;
+extern udi_mei_init_t  udi_meta_info__bridge;
 
 // === EXPORTS ===
-EXPORT(udi_bus_unbind_req);
-EXPORT(udi_bus_unbind_ack);
 EXPORT(udi_bus_bind_req);
 EXPORT(udi_bus_bind_ack);
+EXPORT(udi_bus_unbind_req);
+EXPORT(udi_bus_unbind_ack);
+EXPORT(udi_intr_attach_req);
+EXPORT(udi_intr_attach_ack);
+EXPORT(udi_intr_attach_ack_unused);
+EXPORT(udi_intr_detach_req);
+EXPORT(udi_intr_detach_ack);
+EXPORT(udi_intr_detach_ack_unused);
+EXPORT(udi_intr_event_ind);
+EXPORT(udi_intr_event_rdy);
 
 #define PREP_OPS(type,ml,num)  const type *ops = UDI_int_ChannelPrepForCall(UDI_GCB(cb), ml, num); \
        if(!ops) { Log_Warning("UDI", "%s on wrong channel type", __func__); return ; }
@@ -44,6 +39,7 @@ EXPORT(udi_bus_bind_ack);
        if(!ops) { Log_Warning("UDI", "%s on wrong channel type", __func__); return ; }
 
 // === CODE ===
+#if !USE_MEI
 void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
 {
        UNIMPLEMENTED();
@@ -73,6 +69,7 @@ static void _unmarshal_bus_bind_ack(tUDI_DeferredCall *Call)
 {
        LOG("Call=%p", Call);
        struct marshalled_bus_bind_ack *info = (void*)Call;
+       UDI_int_ChannelReleaseFromCall( Call->cb );
        ((udi_bus_bind_ack_op_t*)Call->Handler)(
                UDI_MCB(Call->cb, udi_bus_bind_cb_t),
                info->dma_constraints,
@@ -101,3 +98,171 @@ void udi_bus_bind_ack(
        call->status = status;
        UDI_int_AddDeferred(&call->Call);
 }
+
+void udi_intr_attach_req(udi_intr_attach_cb_t *cb)
+{
+       LOG("cb=%p", cb);
+       PREP_OPS(udi_bus_bridge_ops_t, &cMetaLang_BusBridge, UDI_BUS_BRIDGE_OPS_NUM)
+       UDI_int_MakeDeferredCb( UDI_GCB(cb), (udi_op_t*)ops->intr_attach_req_op );
+}
+void udi_intr_attach_ack(udi_intr_attach_cb_t *cb, udi_status_t status)
+{
+       LOG("cb=%p,status=%i", cb, status);
+       PREP_OPS(udi_bus_device_ops_t, &cMetaLang_BusBridge, UDI_BUS_DEVICE_OPS_NUM)
+       UDI_int_MakeDeferredCbS( UDI_GCB(cb), (udi_op_t*)ops->intr_attach_ack_op, status );
+}
+
+void udi_intr_detach_req(udi_intr_detach_cb_t *cb)
+{
+       LOG("cb=%p", cb);
+       PREP_OPS(udi_bus_bridge_ops_t, &cMetaLang_BusBridge, UDI_BUS_BRIDGE_OPS_NUM)
+       UDI_int_MakeDeferredCb( UDI_GCB(cb), (udi_op_t*)ops->intr_detach_req_op );
+}
+void udi_intr_detach_ack(udi_intr_detach_cb_t *cb)
+{
+       LOG("cb=%p", cb);
+       PREP_OPS(udi_bus_device_ops_t, &cMetaLang_BusBridge, UDI_BUS_DEVICE_OPS_NUM)
+       UDI_int_MakeDeferredCb( UDI_GCB(cb), (udi_op_t*)ops->intr_detach_ack_op );
+}
+#endif
+
+void udi_intr_event_ind(udi_intr_event_cb_t *cb, udi_ubit8_t flags)
+{
+       LOG("cb=%p,flags=0x%x", cb, flags);
+       PREP_OPS(udi_intr_handler_ops_t, &cMetaLang_BusBridge, UDI_BUS_INTR_HANDLER_OPS_NUM)
+       UDI_int_MakeDeferredCbU8( UDI_GCB(cb), (udi_op_t*)ops->intr_event_ind_op, flags );
+}
+
+void udi_intr_event_rdy(udi_intr_event_cb_t *cb)
+{
+       LOG("cb=%p", cb);
+       PREP_OPS(udi_intr_dispatcher_ops_t, &cMetaLang_BusBridge, UDI_BUS_INTR_DISPATCH_OPS_NUM)
+       UDI_int_MakeDeferredCb( UDI_GCB(cb), (udi_op_t*)ops->intr_event_rdy_op );
+}
+
+void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
+{
+       Log_Error("UDI", "Driver %s caused %s to be called",
+               UDI_int_ChannelGetInstance(UDI_GCB(intr_attach_cb), false, NULL)->Module->ModuleName,
+               __func__);
+}
+void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
+{
+       Log_Error("UDI", "Driver %s caused %s to be called",
+               UDI_int_ChannelGetInstance(UDI_GCB(intr_detach_cb), false, NULL)->Module->ModuleName,
+               __func__);
+}
+
+#if USE_MEI
+UDI_MEI_STUBS(udi_bus_bind_ack, udi_bus_bind_cb_t, 3,
+       (dma_constraints,       preferred_endianness, status      ),
+       (udi_dma_constraints_t, udi_ubit8_t,          udi_status_t),
+       (UDI_VA_POINTER,        UDI_VA_UBIT8_T,       UDI_VA_STATUS_T),
+       UDI_BUS_DEVICE_OPS_NUM, 1)
+UDI_MEI_STUBS(udi_bus_unbind_ack, udi_bus_bind_cb_t, 0,
+       (), (), (),
+       UDI_BUS_DEVICE_OPS_NUM, 2)
+UDI_MEI_STUBS(udi_intr_attach_ack, udi_intr_attach_cb_t, 1,
+       (status), (udi_status_t), (UDI_VA_STATUS_T),
+       UDI_BUS_DEVICE_OPS_NUM, 3)
+UDI_MEI_STUBS(udi_intr_detach_ack, udi_intr_detach_cb_t, 0,
+       (), (), (),
+       UDI_BUS_DEVICE_OPS_NUM, 4)
+
+UDI_MEI_STUBS(udi_bus_bind_req, udi_bus_bind_cb_t, 0,
+       (), (), (),
+       UDI_BUS_BRIDGE_OPS_NUM, 1)
+UDI_MEI_STUBS(udi_bus_unbind_req, udi_bus_bind_cb_t, 0,
+       (), (), (),
+       UDI_BUS_BRIDGE_OPS_NUM, 2)
+UDI_MEI_STUBS(udi_intr_attach_req, udi_intr_attach_cb_t, 0,
+       (), (), (),
+       UDI_BUS_BRIDGE_OPS_NUM, 3)
+UDI_MEI_STUBS(udi_intr_detach_req, udi_intr_detach_cb_t, 0,
+       (), (), (),
+       UDI_BUS_BRIDGE_OPS_NUM, 4)
+
+#endif
+
+// === GLOBALS ==
+udi_layout_t   udi_meta_info__bridge__bus_bind_cb[] = {
+       UDI_DL_END
+};
+udi_layout_t   udi_meta_info__bridge__intr_attach_cb[] = {
+       UDI_DL_STATUS_T,
+       UDI_DL_UBIT8_T,
+       UDI_DL_PIO_HANDLE_T,
+       UDI_DL_END
+};
+udi_layout_t   udi_meta_info__bridge__intr_detach_cb[] = {
+       UDI_DL_INDEX_T,
+       UDI_DL_END
+};
+
+#if USE_MEI
+udi_layout_t   _noargs_marshal[] = {
+       UDI_DL_END
+};
+udi_layout_t   _bus_bind_ack_marshal[] = {
+       UDI_DL_DMA_CONSTRAINTS_T,
+       UDI_DL_UBIT8_T,
+       UDI_DL_STATUS_T,
+       UDI_DL_END
+};
+udi_layout_t   _udi_intr_attach_ack_marshal[] = {
+       UDI_DL_STATUS_T,
+       UDI_DL_END
+};
+
+udi_mei_op_template_t  udi_meta_info__bridge__bus_ops[] = {
+       {"udi_bus_bind_req", UDI_MEI_OPCAT_REQ, 0, UDI_BUS_BIND_CB_NUM, UDI_BUS_DEVICE_OPS_NUM,1, 0,0,
+               udi_bus_bind_req_direct, udi_bus_bind_req_backend, udi_meta_info__bridge__bus_bind_cb,
+               _noargs_marshal},
+       {"udi_bus_unbind_req", UDI_MEI_OPCAT_REQ, 0, UDI_BUS_BIND_CB_NUM, UDI_BUS_DEVICE_OPS_NUM,2, 0,0,
+               udi_bus_unbind_req_direct, udi_bus_unbind_req_backend, udi_meta_info__bridge__bus_bind_cb,
+               _noargs_marshal},
+       {"udi_intr_attach_req", UDI_MEI_OPCAT_REQ, 0, UDI_BUS_INTR_ATTACH_CB_NUM, UDI_BUS_DEVICE_OPS_NUM,3, 0,0,
+               udi_intr_attach_req_direct, udi_intr_attach_req_backend, udi_meta_info__bridge__intr_attach_cb,
+               _noargs_marshal},
+       {"udi_intr_detach_req", UDI_MEI_OPCAT_REQ, 0, UDI_BUS_INTR_DETACH_CB_NUM, UDI_BUS_DEVICE_OPS_NUM,4, 0,0,
+               udi_intr_detach_req_direct, udi_intr_detach_req_backend, udi_meta_info__bridge__intr_detach_cb,
+               _noargs_marshal},
+       {0}
+};
+udi_mei_op_template_t  udi_meta_info__bridge__device_ops[] = {
+       {"udi_bus_bind_ack", UDI_MEI_OPCAT_ACK, 0, UDI_BUS_BIND_CB_NUM, 0,0, 0,0,
+               udi_bus_bind_ack_direct, udi_bus_bind_ack_backend, udi_meta_info__bridge__bus_bind_cb,
+               _bus_bind_ack_marshal},
+       {"udi_bus_unbind_ack", UDI_MEI_OPCAT_ACK, 0, UDI_BUS_BIND_CB_NUM, 0,0, 0,0,
+               udi_bus_unbind_ack_direct, udi_bus_unbind_ack_backend, udi_meta_info__bridge__bus_bind_cb,
+               _noargs_marshal},
+       {"udi_intr_attach_ack", UDI_MEI_OPCAT_ACK, 0, UDI_BUS_INTR_ATTACH_CB_NUM, 0,0, 0,0,
+               udi_intr_attach_ack_direct, udi_intr_attach_ack_backend, udi_meta_info__bridge__intr_attach_cb,
+               _udi_intr_attach_ack_marshal},
+       {"udi_intr_detach_ack", UDI_MEI_OPCAT_ACK, 0, UDI_BUS_INTR_DETACH_CB_NUM, 0,0, 0,0,
+               udi_intr_detach_ack_direct, udi_intr_detach_ack_backend, udi_meta_info__bridge__intr_detach_cb,
+               _noargs_marshal},
+       {0}
+};
+udi_mei_ops_vec_template_t     udi_meta_info__bridge_ops[] = {
+       {UDI_BUS_BRIDGE_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND, udi_meta_info__bridge__bus_ops},
+       {UDI_BUS_DEVICE_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND, udi_meta_info__bridge__device_ops},
+       {0}
+};
+udi_mei_init_t udi_meta_info__bridge = {
+       udi_meta_info__bridge_ops,
+       NULL
+};
+#endif
+tUDI_MetaLang  cMetaLang_BusBridge = {
+       "udi_bridge",
+       // CB Types
+       5,
+       {
+               {0},    // 0: Empty
+               {sizeof(udi_bus_bind_cb_t), udi_meta_info__bridge__bus_bind_cb},
+               {sizeof(udi_intr_attach_cb_t), udi_meta_info__bridge__intr_attach_cb},
+               {sizeof(udi_intr_detach_cb_t), udi_meta_info__bridge__intr_detach_cb},
+               {sizeof(udi_intr_event_cb_t), NULL}
+       }
+};

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