Modules/UDI - Adding PCI and MEI headers
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / include / udi / mei.h
1 /*
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * include/udi/mei.h
6  * - Metalanguage-to-Environment Interface
7  */
8 #ifndef _UDI__MEI_H_
9 #define _UDI__MEI_H_
10
11 typedef const struct udi_mei_init_s     udi_mei_init_t;
12 typedef const struct udi_mei_ops_vec_template_s udi_mei_ops_vec_template_t;
13 typedef const struct uid_mei_op_template_s      uid_mei_op_template_t;
14
15 typedef udi_ubit8_t udi_mei_enumeration_rank_func_t(udi_ubit32_t attr_device_match, void **attr_value_list);
16 typedef void udi_mei_direct_stub_t(udi_op_t *op, udi_cb_t *gcb, va_list arglist);
17 typedef void udi_mei_backend_stub_t(udi_op_t *op, udi_cb_t *gcb, void *marshal_space);
18
19 struct udi_mei_init_s
20 {
21         udi_mei_ops_vec_template_t      *ops_vec_template_list;
22         udi_mei_enumeration_rank_func_t *mei_enumeration_rank;
23 };
24
25 struct udi_mei_ops_vec_template_s
26 {
27         udi_index_t     meta_ops_num;
28         udi_ubit8_t     relationship;
29         const udi_mei_op_template_t     *op_template_list;
30 };
31 // Flags for `relationship`
32 #define UDI_MEI_REL_INITIATOR   (1U<<0)
33 #define UDI_MEI_REL_BIND        (1U<<1)
34 #define UDI_MEI_REL_EXTERNAL    (1U<<2)
35 #define UDI_MEI_REL_INTERNAL    (1U<<3)
36 #define UDI_MEI_REL_SINGLE      (1U<<4)
37
38 struct uid_mei_op_template_s
39 {
40         const char      *op_name;
41         udi_ubit8_t     op_category;
42         udi_ubit8_t     op_flags;
43         udi_index_t     meta_cb_num;
44         udi_index_t     completion_ops_num;
45         udi_index_t     completion_vec_idx;
46         udi_index_t     exception_ops_num;
47         udi_index_t     exception_vec_idx;
48         udi_mei_direct_stub_t   *direct_stub;
49         udi_mei_backend_stub_t  *backend_stub;
50         udi_layout_t    *visible_layout;
51         udi_layout_t    *marshal_layout;
52 };
53 /* Values for op_category */
54 #define UDI_MEI_OPCAT_REQ       1
55 #define UDI_MEI_OPCAT_ACK       2
56 #define UDI_MEI_OPCAT_NAK       3
57 #define UDI_MEI_OPCAT_IND       4
58 #define UDI_MEI_OPCAT_RES       5
59 #define UDI_MEI_OPCAT_RDY       6
60 /* Values for op_flags */
61 #define UDI_MEI_OP_ABORTABLE    (1U<<0)
62 #define UDI_MEI_OP_RECOVERABLE  (1U<<1)
63 #define UDI_MEI_OP_STATE_CHANGE (1U<<2)
64 /* Maximum Sizes For Control Block Layouts */
65 #define UDI_MEI_MAX_VISIBLE_SIZE        2000
66 #define UDI_MEI_MAX_MARSHAL_SIZE        4000
67
68 #define _UDI_MEI_FIRST(lst, ...)        lst
69 #define _UDI_MEI_OTHER(lst, ...)        __VA_ARGS__
70 #define _UDI_MEI_VARG(type,name,vatype) \
71         type name = UDI_VA_ARG(arglist, type, vatype);
72 #define _UDI_MEI_VARGS0()
73 #define _UDI_MEI_VARGS1(args,argt,argva) \
74         _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva))
75 #define _UDI_MEI_VARGS2(args,argt,argva) \
76         _UDI_MEI_VARG(_UDI_MEI_FIRST(argt), _UDI_MEI_FIRST(args),_UDI_MEI_FIRST(argva)) \
77         _UDI_MEI_VARGS1( _UDI_MEI_OTHER(argt), _UDI_MEI_OTHER(args), _UDI_MEI_OTHER(argva) )
78         
79 #define UDI_MEI_STUBS(op_name, cb_type, argc, args, arg_types, arg_va_list, meta_ops_num, vec_idx) \
80         void op_name(cb_type *cb, _UDI_ARG_LIST_##argc args ) {\
81                 udi_mei_call(UDI_GCB(cb), &udi_mei_info, meta_ops_num, vec_idx, args);\
82         }\
83         void op_name##_direct(udi_op_t *op, udi_cb_t *gcb, va_lis arglist) {\
84                 _UDI_MEI_VARGS##argc(args ,## arg_types ,## arg_va_list)\
85                 (*(op_name##_op_t)op)(UDI_MCB(gcb, cb_type) ,## args);\
86         }\
87         void op_name##_backend(udi_op_t *op, udi_cb_t *gcb, void *marshal_space) {\
88         }
89
90 #endif
91

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