Modules/UDI - Working on more framework and PCI bus
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / trans / bus_pci.c
1 /*
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * trans/bus_pci.c
6  * - PCI Bus Driver
7  */
8 #include <udi.h>
9 #include <udi_physio.h>
10 #include <drv_pci.h>    // acess
11
12 // === MACROS ===
13 /* Copied from http://projectudi.cvs.sourceforge.net/viewvc/projectudi/udiref/driver/udi_dpt/udi_dpt.h */
14 #define DPT_SET_ATTR_BOOLEAN(attr, name, val)   \
15                 udi_strcpy((attr)->attr_name, (name)); \
16                 (attr)->attr_type = UDI_ATTR_BOOLEAN; \
17                 (attr)->attr_length = sizeof(udi_boolean_t); \
18                 UDI_ATTR32_SET((attr)->attr_value, (val))
19
20 #define DPT_SET_ATTR32(attr, name, val) \
21                 udi_strcpy((attr)->attr_name, (name)); \
22                 (attr)->attr_type = UDI_ATTR_UBIT32; \
23                 (attr)->attr_length = sizeof(udi_ubit32_t); \
24                 UDI_ATTR32_SET((attr)->attr_value, (val))
25
26 #define DPT_SET_ATTR_ARRAY8(attr, name, val, len) \
27                 udi_strcpy((attr)->attr_name, (name)); \
28                 (attr)->attr_type = UDI_ATTR_ARRAY8; \
29                 (attr)->attr_length = (len); \
30                 udi_memcpy((attr)->attr_value, (val), (len))
31
32 #define DPT_SET_ATTR_STRING(attr, name, val, len) \
33                 udi_strcpy((attr)->attr_name, (name)); \
34                 (attr)->attr_type = UDI_ATTR_STRING; \
35                 (attr)->attr_length = (len); \
36                 udi_strncpy_rtrim((char *)(attr)->attr_value, (val), (len))
37
38
39 // === TYPES ===
40 typedef struct
41 {
42         udi_init_context_t      init_context;
43         
44         tPCIDev cur_iter;
45 } pci_rdata_t;
46
47 // === PROTOTYPES ===
48 void    pci_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
49 void    pci_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
50 void    pci_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID);
51 void    pci_final_cleanup_req(udi_mgmt_cb_t *cb);
52
53 void    pci_bridge_ch_event_ind(udi_channel_event_cb_t *cb);
54 void    pci_unbind_req(udi_bus_bind_cb_t *cb);
55 void    pci_bind_req_op(udi_bus_bind_cb_t *cb);
56 void    pci_intr_attach_req(udi_intr_attach_cb_t *cb);
57 void    pci_intr_detach_req(udi_intr_detach_cb_t *cb);
58
59
60 // === CODE ===
61 void pci_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
62 {
63         UNIMPLEMENTED();
64 }
65 void pci_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
66 {
67         pci_rdata_t     *rdata = UDI_GCB(cb)->context;
68         switch(enumeration_level)
69         {
70         case UDI_ENUMERATE_START:
71         case UDI_ENUMERATE_START_RESCAN:
72                 rdata->cur_iter = -1;
73         case UDI_ENUMERATE_NEXT:
74                 // TODO: Filters
75                 if( (rdata->cur_iter = PCI_GetDeviceByClass(0,0, rdata->cur_iter)) == -1 )
76                 {
77                         udi_enumerate_ack(cb, UDI_ENUMERATE_DONE, 0);
78                 }
79                 else
80                 {
81                         udi_instance_attr_list_t *attr_list = cb->attr_list;
82                         Uint16  ven, dev;
83                         Uint32  class;
84                         PCI_GetDeviceInfo(rdata->cur_iter, &ven, &dev, &class);
85
86                         DPT_SET_ATTR_STRING(attr_list, "bus_type", "pci", 3);
87                         attr_list ++;
88                         DPT_SET_ATTR32(attr_list, "pci_vendor_id", ven);
89                         attr_list ++;
90                         DPT_SET_ATTR32(attr_list, "pci_device_id", dev);
91                         attr_list ++;
92
93                         cb->attr_valid_length = attr_list - cb->attr_list;
94                         udi_enumerate_ack(cb, UDI_ENUMERATE_OK, 0);
95                 }
96                 break;
97         }
98 }
99 void pci_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID)
100 {
101         UNIMPLEMENTED();
102 }
103 void pci_final_cleanup_req(udi_mgmt_cb_t *cb)
104 {
105         UNIMPLEMENTED();
106 }
107
108 void pci_bridge_ch_event_ind(udi_channel_event_cb_t *cb)
109 {
110         UNIMPLEMENTED();
111 }
112 void pci_unbind_req(udi_bus_bind_cb_t *cb)
113 {
114         UNIMPLEMENTED();
115 }
116 void pci_bind_req_op(udi_bus_bind_cb_t *cb)
117 {
118         UNIMPLEMENTED();
119 }
120 void pci_intr_attach_req(udi_intr_attach_cb_t *cb)
121 {
122         UNIMPLEMENTED();
123 }
124 void pci_intr_detach_req(udi_intr_detach_cb_t *cb)
125 {
126         UNIMPLEMENTED();
127 }
128
129 // === UDI Functions ===
130 udi_mgmt_ops_t  pci_mgmt_ops = {
131         pci_usage_ind,
132         pci_enumerate_req,
133         pci_devmgmt_req,
134         pci_final_cleanup_req
135 };
136 udi_ubit8_t     pci_mgmt_op_flags[4] = {0,0,0,0};
137 udi_bus_bridge_ops_t    pci_bridge_ops = {
138         pci_bridge_ch_event_ind,
139         pci_unbind_req,
140         pci_bind_req_op,
141         pci_intr_attach_req,
142         pci_intr_detach_req
143 };
144 udi_ubit8_t     pci_bridge_op_flags[5] = {0,0,0,0,0};
145 udi_primary_init_t      pci_pri_init = {
146         .mgmt_ops = &pci_mgmt_ops,
147         .mgmt_op_flags = pci_mgmt_op_flags,
148         .mgmt_scratch_requirement = 0,
149         .enumeration_attr_list_length = 4,
150         .rdata_size = sizeof(pci_rdata_t),
151         .child_data_size = 0,
152         .per_parent_paths = 0
153 };
154 udi_ops_init_t  pci_ops_list[] = {
155         {
156                 1, 1, UDI_BUS_BRIDGE_OPS_NUM,
157                 0,
158                 (udi_ops_vector_t*)&pci_bridge_ops,
159                 pci_bridge_op_flags
160         },
161         {0}
162 };
163 udi_init_t      pci_init = {
164         .primary_init_info = &pci_pri_init,
165         .ops_init_list = pci_ops_list
166 };
167 const char      pci_udiprops[] =
168         "properties_version 0x101\0"
169         "message 1 Acess2 Kernel\0"
170         "message 2 John Hodge ([email protected])\0"
171         "message 3 Acess2 PCI Bus\0"
172         "supplier 1\0"
173         "contact 2\0"
174         "name 3\0"
175         "module acess_pci\0"
176         "shortname acesspci\0"
177         "requires udi 0x101\0"
178         "provides udi_bridge 0x101\0"
179         "meta 1 udi_bridge\0"
180         "region 0\0"
181         "child_bind_ops 1 0 1\0"
182         "";
183 size_t  pci_udiprops_size = sizeof(pci_udiprops);

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