3 * - By John Hodge (thePowersGang)
9 #include <udi_physio.h>
10 #include <drv_pci.h> // acess
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))
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))
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))
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))
42 udi_init_context_t init_context;
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);
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);
61 void pci_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
65 void pci_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
67 pci_rdata_t *rdata = UDI_GCB(cb)->context;
68 switch(enumeration_level)
70 case UDI_ENUMERATE_START:
71 case UDI_ENUMERATE_START_RESCAN:
73 case UDI_ENUMERATE_NEXT:
75 if( (rdata->cur_iter = PCI_GetDeviceByClass(0,0, rdata->cur_iter)) == -1 )
77 udi_enumerate_ack(cb, UDI_ENUMERATE_DONE, 0);
81 udi_instance_attr_list_t *attr_list = cb->attr_list;
84 PCI_GetDeviceInfo(rdata->cur_iter, &ven, &dev, &class);
86 DPT_SET_ATTR_STRING(attr_list, "bus_type", "pci", 3);
88 DPT_SET_ATTR32(attr_list, "pci_vendor_id", ven);
90 DPT_SET_ATTR32(attr_list, "pci_device_id", dev);
93 cb->attr_valid_length = attr_list - cb->attr_list;
94 udi_enumerate_ack(cb, UDI_ENUMERATE_OK, 0);
99 void pci_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID)
103 void pci_final_cleanup_req(udi_mgmt_cb_t *cb)
108 void pci_bridge_ch_event_ind(udi_channel_event_cb_t *cb)
112 void pci_unbind_req(udi_bus_bind_cb_t *cb)
116 void pci_bind_req_op(udi_bus_bind_cb_t *cb)
120 void pci_intr_attach_req(udi_intr_attach_cb_t *cb)
124 void pci_intr_detach_req(udi_intr_detach_cb_t *cb)
129 // === UDI Functions ===
130 udi_mgmt_ops_t pci_mgmt_ops = {
134 pci_final_cleanup_req
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,
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
154 udi_ops_init_t pci_ops_list[] = {
156 1, 1, UDI_BUS_BRIDGE_OPS_NUM,
158 (udi_ops_vector_t*)&pci_bridge_ops,
163 udi_init_t pci_init = {
164 .primary_init_info = &pci_pri_init,
165 .ops_init_list = pci_ops_list
167 const char pci_udiprops[] =
168 "properties_version 0x101\0"
169 "message 1 Acess2 Kernel\0"
171 "message 3 Acess2 PCI Bus\0"
176 "shortname acesspci\0"
177 "requires udi 0x101\0"
178 "provides udi_bridge 0x101\0"
179 "meta 1 udi_bridge\0"
181 "child_bind_ops 1 0 1\0"
183 size_t pci_udiprops_size = sizeof(pci_udiprops);