Modules/UDI - Implementing proper enumeration framework
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / meta_mgmt.c
1 /**
2  * \file meta_mgmt.c
3  * \author John Hodge (thePowersGang)
4  */
5 #define DEBUG   1
6 #include <acess.h>
7 #include <udi.h>
8 #include "../udi_internal.h"
9 #include "../udi_ma.h"
10
11 // === EXPORTS ===
12 EXPORT(udi_usage_ind);
13 EXPORT(udi_static_usage);
14 EXPORT(udi_usage_res);
15 EXPORT(udi_enumerate_req);
16 EXPORT(udi_enumerate_no_children);
17 EXPORT(udi_enumerate_ack);
18 EXPORT(udi_devmgmt_req);
19 EXPORT(udi_devmgmt_ack);
20 EXPORT(udi_final_cleanup_req);
21 EXPORT(udi_final_cleanup_ack);
22
23 tUDI_MetaLang   cMetaLang_Management = {
24         "udi_mgmt",
25         1,
26         {NULL},
27         
28         1,
29         {
30                 {sizeof(udi_enumerate_cb_t)-sizeof(udi_cb_t), NULL}
31         }
32 };
33
34 // === CODE ===
35 void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
36 {
37         LOG("cb=%p{...}, resource_level=%i", cb, resource_level);
38         const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 );
39         if(!ops) {
40                 Log_Warning("UDI", "%s on wrong channel type", __func__);
41                 return ;
42         }
43         
44         UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) );
45         ops->usage_ind_op(cb, resource_level);
46 }
47
48 void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
49 {
50         cb->trace_mask = 0;
51         udi_usage_res(cb);
52 }
53
54 void udi_usage_res(udi_usage_cb_t *cb)
55 {
56         // TODO: Update trace mask from cb
57         LOG("cb=%p{cb->trace_mask=%x}", cb, cb->trace_mask);
58 }
59
60 void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
61 {
62         LOG("cb=%p{...}, enumeration_level=%i", cb, enumeration_level);
63         const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 );
64         if(!ops) {
65                 Log_Warning("UDI", "%s on wrong channel type", __func__);
66                 return ;
67         }
68         
69         UDI_int_MakeDeferredCbU8( UDI_GCB(cb), (udi_op_t*)ops->enumerate_req_op, enumeration_level );
70 //      UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) );
71 //      ops->enumerate_req_op(cb, enumeration_level);
72 }
73
74 void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
75 {
76         udi_enumerate_ack(cb, UDI_ENUMERATE_LEAF, 0);
77 }
78
79 void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx)
80 {
81         UDI_int_ChannelFlip( UDI_GCB(cb) );
82         LOG("cb=%p, enumeration_result=%i, ops_idx=%i", cb, enumeration_result, ops_idx);
83         switch( enumeration_result )
84         {
85         case UDI_ENUMERATE_OK:
86                 #if DEBUG
87                 for( int i = 0; i < cb->attr_valid_length; i ++ )
88                 {
89                         udi_instance_attr_list_t        *at = &cb->attr_list[i];
90                         switch(at->attr_type)
91                         {
92                         case UDI_ATTR_STRING:
93                                 LOG("[%i] String '%.*s'", i, at->attr_length, at->attr_value);
94                                 break;
95                         case UDI_ATTR_UBIT32:
96                                 LOG("[%i] UBit32 0x%08x", i, UDI_ATTR32_GET(at->attr_value));
97                                 break;
98                         default:
99                                 LOG("[%i] %i", i, at->attr_type);
100                                 break;
101                         }
102                 }
103                 #endif
104                 // Returned a device
105                 UDI_MA_AddChild(cb, ops_idx);
106                 udi_enumerate_req(cb, UDI_ENUMERATE_NEXT);
107                 return ;
108         case UDI_ENUMERATE_DONE:
109                 // All done. Chain terminates
110                 return ;
111         default:
112                 Log_Notice("UDI", "Unknown enumeration_result %i", enumeration_result);
113                 return ;
114         }
115 }
116
117 void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
118 {       
119         ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
120         LEAVE('-');
121 }
122
123 void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
124 {
125         ENTER("pcb xflags istatus", cb, flags, status);
126         LEAVE('-');
127 }
128
129 void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
130 {
131         ENTER("pcb", cb);
132         LEAVE('-');
133 }
134
135 void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)
136 {
137         ENTER("pcb", cb);
138         LEAVE('-');
139 }
140

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