1/* 2 * Copyright 2005, Axel D��rfler, axeld@pinc-software.de. All rights reserved. 3 * Copyright 2002/03, Thomas Kurschel. All rights reserved. 4 * 5 * Distributed under the terms of the MIT License. 6 */ 7 8/* 9 ISA bus manager 10 11 Implementation. 12*/ 13 14 15#include <ISA.h> 16#include <bus/ISA.h> 17#include <KernelExport.h> 18#include <device_manager.h> 19#include <arch/cpu.h> 20 21#include <stdlib.h> 22#include <string.h> 23 24#include "isa_arch.h" 25 26//#define TRACE_ISA 27#ifdef TRACE_ISA 28# define TRACE(x) dprintf x 29#else 30# define TRACE(x) ; 31#endif 32 33// ToDo: this is architecture dependent and should be made differently! 34// (for example, the Pegasos (PPC based) also has an ISA bus) 35 36 37#define ISA_MODULE_NAME "bus_managers/isa/root/driver_v1" 38 39device_manager_info *pnp; 40 41 42static long 43make_isa_dma_table(const void *buffer, long buffer_size, ulong num_bits, 44 isa_dma_entry *table, long num_entries) 45{ 46 // ToDo: implement this?! 47 return ENOSYS; 48} 49 50 51static long 52start_scattered_isa_dma(long channel, const isa_dma_entry *table, 53 uchar mode, uchar emode) 54{ 55 // ToDo: implement this?! 56 return ENOSYS; 57} 58 59 60static status_t 61lock_isa_dma_channel(long channel) 62{ 63 // ToDo: implement this?! 64 return B_NOT_ALLOWED; 65} 66 67 68static status_t 69unlock_isa_dma_channel(long channel) 70{ 71 // ToDo: implement this?! 72 return B_ERROR; 73} 74 75 76// #pragma mark - driver module API 77 78 79static status_t 80isa_init_driver(device_node *node, void **cookie) 81{ 82 *cookie = node; 83 return B_OK; 84} 85 86 87static void 88isa_uninit_driver(void *cookie) 89{ 90} 91 92 93static float 94isa_supports_device(device_node *parent) 95{ 96 const char *bus; 97 98 // make sure parent is really pnp root 99 if (pnp->get_attr_string(parent, B_DEVICE_BUS, &bus, false)) 100 return B_ERROR; 101 102 if (strcmp(bus, "root")) 103 return 0.0; 104 105 return 1.0; 106} 107 108 109static status_t 110isa_register_device(device_node *parent) 111{ 112 static const device_attr attrs[] = { 113 // tell where to look for child devices 114 {B_DEVICE_BUS, B_STRING_TYPE, {string: "isa" }}, 115 {B_DEVICE_FLAGS, B_UINT32_TYPE, 116 {ui32: B_FIND_CHILD_ON_DEMAND | B_FIND_MULTIPLE_CHILDREN}}, 117 {} 118 }; 119 120 return pnp->register_node(parent, ISA_MODULE_NAME, attrs, NULL, NULL); 121} 122 123 124static status_t 125std_ops(int32 op, ...) 126{ 127 switch (op) { 128 case B_MODULE_INIT: 129 return arch_isa_init(); 130 case B_MODULE_UNINIT: 131 return B_OK; 132 133 default: 134 return B_ERROR; 135 } 136} 137 138 139module_dependency module_dependencies[] = { 140 { B_DEVICE_MANAGER_MODULE_NAME, (module_info **)&pnp }, 141 {} 142}; 143 144static isa_module_info isa_module = { 145 { 146 { 147 B_ISA_MODULE_NAME, 148 B_KEEP_LOADED, 149 std_ops 150 }, 151 NULL // rescan 152 }, 153 &arch_isa_read_io_8, 154 &arch_isa_write_io_8, 155 &arch_isa_read_io_16, 156 &arch_isa_write_io_16, 157 &arch_isa_read_io_32, 158 &arch_isa_write_io_32, 159 &arch_isa_ram_address, 160 &make_isa_dma_table, 161 &arch_start_isa_dma, 162 &start_scattered_isa_dma, 163 &lock_isa_dma_channel, 164 &unlock_isa_dma_channel 165}; 166 167static isa2_module_info isa2_module = { 168 { 169 { 170 ISA_MODULE_NAME, 171 0, 172 std_ops 173 }, 174 175 isa_supports_device, 176 isa_register_device, 177 isa_init_driver, 178 isa_uninit_driver, 179 NULL, // removed device 180 NULL, // register child devices 181 NULL, // rescan bus 182 }, 183 184 arch_isa_read_io_8, arch_isa_write_io_8, 185 arch_isa_read_io_16, arch_isa_write_io_16, 186 arch_isa_read_io_32, arch_isa_write_io_32, 187 188 arch_isa_ram_address, 189 190 arch_start_isa_dma, 191}; 192 193module_info *modules[] = { 194 (module_info *)&isa_module, 195 (module_info *)&isa2_module, 196 NULL 197}; 198