2 * \file udi_lib/physio/pio.c
3 * \author John Hodge (thePowersGang)
8 #include <udi_physio.h>
9 #include "../../udi_internal.h"
11 typedef void _udi_pio_do_io_op_t(uint32_t child_ID, udi_ubit32_t regset_idx, udi_ubit32_t ofs, size_t len,
12 void *data, bool isOutput);
15 struct udi_pio_handle_s
17 tUDI_DriverInstance *Inst;
18 udi_index_t RegionIdx;
20 _udi_pio_do_io_op_t *IOFunc;
25 udi_pio_trans_t *TransOps;
27 udi_ubit16_t PIOAttributes;
31 // TODO: Cached labels
35 extern _udi_pio_do_io_op_t pci_pio_do_io;
39 EXPORT(udi_pio_unmap);
40 EXPORT(udi_pio_atmic_sizes);
41 EXPORT(udi_pio_abort_sequence);
42 EXPORT(udi_pio_trans);
43 EXPORT(udi_pio_probe);
46 void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb,
47 udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length,
48 udi_pio_trans_t *trans_list, udi_ubit16_t list_length,
49 udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain)
51 LOG("gcb=%p,regset_idx=%i,base_offset=0x%x,length=0x%x,trans_list=%p,list_length=%i,...",
52 gcb, regset_idx, base_offset, length, trans_list, list_length);
54 udi_instance_attr_type_t type;
55 type = udi_instance_attr_get_internal(gcb, "bus_type", 0, bus_type, sizeof(bus_type), NULL);
56 if(type != UDI_ATTR_STRING) {
57 Log_Warning("UDI", "No/invalid bus_type attribute");
58 callback(gcb, UDI_NULL_PIO_HANDLE);
63 _udi_pio_do_io_op_t *io_op;
64 if( strcmp(bus_type, "pci") == 0 ) {
66 io_op = pci_pio_do_io;
70 callback(gcb, UDI_NULL_PIO_HANDLE);
74 udi_pio_handle_t ret = malloc( sizeof(struct udi_pio_handle_s) );
75 ret->Inst = UDI_int_ChannelGetInstance(gcb, false, &ret->RegionIdx);
77 ret->Offset = base_offset;
79 ret->TransOps = trans_list;
80 // TODO: Pre-scan to get labels
81 ret->nTransOps = list_length;
82 ret->PIOAttributes = pio_attributes;
84 // TODO: Validate serialization_domain
85 ret->Domain = serialization_domain;
90 void udi_pio_unmap(udi_pio_handle_t pio_handle)
95 udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle)
101 void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement)
106 void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb,
107 udi_pio_handle_t pio_handle, udi_index_t start_label,
108 udi_buf_t *buf, void *mem_ptr)
113 void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,
114 udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset,
115 udi_ubit8_t tran_size, udi_ubit8_t direction)