From eda93f58db0cc2259a529ae982ba2cee37691a3d Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 9 Feb 2014 10:01:32 +0800 Subject: [PATCH 1/1] UDI/meta_bus - Switch to MEI --- .../Interfaces/UDI/udi_lib/physio/meta_bus.c | 227 +++++------------- 1 file changed, 62 insertions(+), 165 deletions(-) diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c index 0c21222b..ffc2a8ab 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c @@ -11,8 +11,6 @@ #include #include -#define USE_MEI 0 - #define udi_mei_info udi_meta_info__bridge extern tUDI_MetaLang cMetaLang_BusBridge; @@ -39,121 +37,6 @@ EXPORT(udi_intr_event_rdy); 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(); -} -void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb) -{ - UNIMPLEMENTED(); -} - -void udi_bus_bind_req(udi_bus_bind_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->bus_bind_req_op ); -} - -struct marshalled_bus_bind_ack -{ - tUDI_DeferredCall Call; - udi_dma_constraints_t dma_constraints; - udi_ubit8_t preferred_endianness; - udi_status_t status; -}; - -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, - info->preferred_endianness, - info->status); - free(info); -} - -void udi_bus_bind_ack( - udi_bus_bind_cb_t *cb, - udi_dma_constraints_t dma_constraints, - udi_ubit8_t preferred_endianness, - udi_status_t status - ) -{ - LOG("cb=%p{...}, dma_constraints=%p, preferred_endianness=%i,status=%i", - cb, dma_constraints, preferred_endianness, status); - PREP_OPS(udi_bus_device_ops_t, &cMetaLang_BusBridge, UDI_BUS_DEVICE_OPS_NUM) - - struct marshalled_bus_bind_ack *call = NEW(struct marshalled_bus_bind_ack,); - call->Call.Unmarshal = _unmarshal_bus_bind_ack; - call->Call.cb = UDI_GCB(cb); - call->Call.Handler = (udi_op_t*)ops->bus_bind_ack_op; - call->dma_constraints = dma_constraints; - call->preferred_endianness = preferred_endianness; - 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), @@ -165,9 +48,21 @@ UDI_MEI_STUBS(udi_bus_unbind_ack, udi_bus_bind_cb_t, 0, 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) +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__); +} UDI_MEI_STUBS(udi_intr_detach_ack, udi_intr_detach_cb_t, 0, (), (), (), UDI_BUS_DEVICE_OPS_NUM, 4) +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__); +} UDI_MEI_STUBS(udi_bus_bind_req, udi_bus_bind_cb_t, 0, (), (), (), @@ -182,44 +77,59 @@ UDI_MEI_STUBS(udi_intr_detach_req, udi_intr_detach_cb_t, 0, (), (), (), UDI_BUS_BRIDGE_OPS_NUM, 4) -#endif +UDI_MEI_STUBS(udi_intr_event_rdy, udi_intr_event_cb_t, 0, + (), (), (), + UDI_BUS_INTR_DISPATCH_OPS_NUM, 1) +UDI_MEI_STUBS(udi_intr_event_ind, udi_intr_event_cb_t, 1, + (flags), (udi_ubit8_t), (UDI_VA_UBIT8_T), + UDI_BUS_INTR_HANDLER_OPS_NUM, 1) + // === GLOBALS == -udi_layout_t udi_meta_info__bridge__bus_bind_cb[] = { +udi_layout_t _BUS_BIND_cb_layout[] = { UDI_DL_END }; -udi_layout_t udi_meta_info__bridge__intr_attach_cb[] = { +udi_layout_t _BUS_INTR_ATTACH_cb_layout[] = { 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_layout_t _BUS_INTR_DETACH_cb_layout[] = { UDI_DL_INDEX_T, UDI_DL_END }; -udi_layout_t udi_meta_info__bridge__intr_event_cb[] = { - UDI_DL_END -}; - -udi_layout_t _BUS_BIND_cb_layout[] = { +udi_layout_t _BUS_INTR_EVENT_cb_layout[] = { + UDI_DL_BUF, + 0,0,0, + UDI_DL_UBIT16_T, UDI_DL_END }; -#if USE_MEI -udi_layout_t _noargs_marshal[] = { +static const udi_layout_t _noargs_marshal[] = { UDI_DL_END }; -udi_layout_t _bus_bind_ack_marshal[] = { +#define _udi_bus_bind_req_marshal_layout _noargs_marshal +#define _udi_bus_unbind_req_marshal_layout _noargs_marshal +#define _udi_intr_attach_req_marshal_layout _noargs_marshal +#define _udi_intr_detach_req_marshal_layout _noargs_marshal +const udi_layout_t _udi_bus_bind_ack_marshal_layout[] = { UDI_DL_DMA_CONSTRAINTS_T, UDI_DL_UBIT8_T, UDI_DL_STATUS_T, UDI_DL_END }; -udi_layout_t _udi_intr_attach_ack_marshal[] = { +#define _udi_bus_unbind_ack_marshal_layout _noargs_marshal +const udi_layout_t _udi_intr_attach_ack_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END }; +#define _udi_intr_detach_ack_marshal_layout _noargs_marshal +#define _udi_intr_event_rdy_marshal_layout _noargs_marshal +const udi_layout_t _udi_intr_event_ind_marshal_layout[] = { + UDI_DL_UBIT8_T, + UDI_DL_END +}; #define UDI__OPS_NUM 0 #define MEI_OPINFO(name,cat,flags,cbtype,rsp_ops,rsp_idx,err_ops,err_idx) \ @@ -228,61 +138,48 @@ udi_layout_t _udi_intr_attach_ack_marshal[] = { name##_direct, name##_backend, _##cbtype##_cb_layout, _##name##_marshal_layout } udi_mei_op_template_t udi_meta_info__bridge__bus_ops[] = { - #define _udi_bus_bind_req_marshal_layout _noargs_marshal MEI_OPINFO(udi_bus_bind_req, REQ, 0, BUS_BIND, BUS_DEVICE,1, ,0), -// {"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}, + MEI_OPINFO(udi_bus_unbind_req, REQ, 0, BUS_BIND, BUS_DEVICE,2, ,0), + MEI_OPINFO(udi_intr_attach_req, REQ, 0, BUS_INTR_ATTACH, BUS_DEVICE,3, ,0), + MEI_OPINFO(udi_intr_detach_req, REQ, 0, BUS_INTR_DETACH, BUS_DEVICE,4, ,0), {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}, + MEI_OPINFO(udi_bus_bind_ack, ACK, 0, BUS_BIND, ,0, ,0), + MEI_OPINFO(udi_bus_unbind_ack, ACK, 0, BUS_BIND, ,0, ,0), + MEI_OPINFO(udi_intr_attach_ack, ACK, 0, BUS_INTR_ATTACH, ,0, ,0), + MEI_OPINFO(udi_intr_detach_ack, ACK, 0, BUS_INTR_DETACH, ,0, ,0), + {0} +}; +udi_mei_op_template_t udi_meta_info__bridge__intr_disp_ops[] = { + MEI_OPINFO(udi_intr_event_rdy, RDY, 0, BUS_INTR_EVENT, ,0, ,0), + {0} +}; +udi_mei_op_template_t udi_meta_info__bridge__intr_hdlr_ops[] = { + MEI_OPINFO(udi_intr_event_ind, IND, 0, BUS_INTR_EVENT, ,0, ,0), {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_BRIDGE_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR|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}, + {UDI_BUS_INTR_DISPATCH_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR, udi_meta_info__bridge__intr_disp_ops}, + {UDI_BUS_INTR_HANDLER_OPS_NUM, UDI_MEI_REL_EXTERNAL, udi_meta_info__bridge__intr_hdlr_ops}, {0} }; udi_mei_init_t udi_meta_info__bridge = { udi_meta_info__bridge_ops, NULL }; -#endif tUDI_MetaLang cMetaLang_BusBridge = { "udi_bridge", - #if USE_MEI &udi_meta_info__bridge, - #else - NULL, - #endif // CB Types 5, { {0}, // 0: Empty - {sizeof(udi_bus_bind_cb_t), 0, udi_meta_info__bridge__bus_bind_cb}, - {sizeof(udi_intr_attach_cb_t), 0, udi_meta_info__bridge__intr_attach_cb}, - {sizeof(udi_intr_detach_cb_t), 0, udi_meta_info__bridge__intr_detach_cb}, - {sizeof(udi_intr_event_cb_t), 0, NULL} + {sizeof(udi_bus_bind_cb_t), 0, _BUS_BIND_cb_layout}, + {sizeof(udi_intr_attach_cb_t), 0, _BUS_INTR_ATTACH_cb_layout}, + {sizeof(udi_intr_detach_cb_t), 0, _BUS_INTR_DETACH_cb_layout}, + {sizeof(udi_intr_event_cb_t), 0, _BUS_INTR_EVENT_cb_layout} } }; -- 2.20.1