|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1993, 1994 NeXT Computer, Inc. ! 27: * ! 28: * Exported interface for Kernel Bus Resource Object(s). ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 1 Jul 1994 ? at NeXT ! 33: * Modifications to support shared interrupts. ! 34: * 16 Mar 1994 ? at NeXT ! 35: * Added range mapping. ! 36: * 24 Feb 1994 ? at NeXT ! 37: * Major rewrite. ! 38: * 29 Oct 1993 ? at NeXT ! 39: * Created. ! 40: */ ! 41: ! 42: #ifdef DRIVER_PRIVATE ! 43: ! 44: #import <objc/Object.h> ! 45: ! 46: #import <mach/mach_types.h> ! 47: ! 48: /* ! 49: * The item object can be used to ! 50: * allocate a small number (max 1024) ! 51: * of items { base, base + count }, ! 52: * individually. The only ! 53: * constraint placed upon this ! 54: * range is that it may not ! 55: * wrap around. ! 56: */ ! 57: ! 58: @interface KernBusItemResource : Object ! 59: { ! 60: @private ! 61: id _owner; ! 62: unsigned int _count; ! 63: unsigned int _base; ! 64: id _kind; ! 65: int _itemCount; ! 66: void *_items; ! 67: } ! 68: ! 69: - initWithItemCount: (unsigned int)count ! 70: itemBase: (unsigned int)base ! 71: itemKind: kind ! 72: owner: owner; ! 73: - initWithItemCount: (unsigned int)count ! 74: itemKind: kind ! 75: owner: owner; ! 76: ! 77: - reserveItem: (unsigned int)item; ! 78: - shareItem: (unsigned int)item; ! 79: ! 80: - (unsigned int)findFreeItem; ! 81: ! 82: @end ! 83: ! 84: @interface KernBusItem : Object ! 85: { ! 86: @private ! 87: id _resource; ! 88: unsigned int _item; ! 89: int _useCount; ! 90: BOOL _shareable; ! 91: } ! 92: ! 93: - initForResource: resource ! 94: item: (unsigned int)item ! 95: shareable: (BOOL)shareable; ! 96: - dealloc; ! 97: ! 98: - share; ! 99: - (unsigned int)item; ! 100: ! 101: @end ! 102: ! 103: /* ! 104: * The range object is used to allocate ! 105: * ranges of values in a large, ! 106: * potentially sparse address space. ! 107: * It does support the full range ! 108: * of address values, where a full ! 109: * range {0, maxunsigned int + 1} is ! 110: * denoted as (Range) { 0, 0 }. ! 111: */ ! 112: ! 113: typedef struct _Range { ! 114: unsigned int base; ! 115: unsigned int length; ! 116: } Range; ! 117: ! 118: #define RangeMAX ((Range) { 0, 0 }) ! 119: ! 120: static __inline__ ! 121: BOOL ! 122: rangeIsValid( ! 123: Range range ! 124: ) ! 125: { ! 126: unsigned int end = range.base + range.length; ! 127: ! 128: if (end > 0 && end <= range.base) ! 129: return NO; ! 130: ! 131: return YES; ! 132: } ! 133: ! 134: @interface KernBusRangeResource : Object ! 135: { ! 136: @private ! 137: id _owner; ! 138: unsigned int _base; ! 139: unsigned int _end; ! 140: id _kind; ! 141: int _rangeCount; ! 142: void *_ranges; ! 143: } ! 144: ! 145: - initWithExtent: (Range)extent ! 146: kind: kind ! 147: owner: owner; ! 148: ! 149: - reserveRange: (Range)range; ! 150: - shareRange: (Range)range; ! 151: ! 152: - (Range)findFreeRangeWithSize:(unsigned int)size ! 153: alignment:(unsigned int)align; ! 154: ! 155: @end ! 156: ! 157: @interface KernBusRange : Object ! 158: { ! 159: @private ! 160: void *_next; ! 161: id _resource; ! 162: unsigned int _base; ! 163: unsigned int _end; ! 164: int _useCount; ! 165: BOOL _shareable; ! 166: int _mappingCount; ! 167: } ! 168: ! 169: - initForResource: resource ! 170: range: (Range)range ! 171: shareable: (BOOL)shareable; ! 172: - dealloc; ! 173: ! 174: - share; ! 175: - (Range)range; ! 176: ! 177: @end ! 178: ! 179: /* ! 180: * A mapping is basically an ! 181: * an alias for a range. ! 182: * Multiple mappings for a ! 183: * particular range can be ! 184: * created, and each one ! 185: * can refer either to the ! 186: * entire range, or only a ! 187: * portion of it. ! 188: */ ! 189: ! 190: @interface KernBusRangeMapping : Object ! 191: { ! 192: @private ! 193: id _range; ! 194: Range _mappedRange; ! 195: } ! 196: ! 197: - initWithRange: range ! 198: subRange: (Range)subRange; ! 199: ! 200: - (Range)mappedRange; ! 201: ! 202: @end ! 203: ! 204: /* ! 205: * The generic bus object is ! 206: * available for subclassing by ! 207: * specific bus architectures. ! 208: * The bus object defines the ! 209: * system resources (interrupt ! 210: * sources, dma channels, ! 211: * physical memory regions, ! 212: * io port ranges), which ! 213: * need to be allocated among ! 214: * the device drivers. ! 215: */ ! 216: ! 217: @interface KernBus : Object ! 218: { ! 219: @private ! 220: void *_resources; ! 221: int _activeResourceCount; ! 222: int _busId; ! 223: } ! 224: ! 225: - (BOOL)areResourcesActive; ! 226: ! 227: /* ! 228: * Returns a NULL-terminated array of the names of resources ! 229: * defined by this bus. ! 230: */ ! 231: - (const char **)resourceNames; ! 232: ! 233: /* ! 234: * Creates a KernDeviceDescription from an IOConfigTable. ! 235: */ ! 236: + deviceDescriptionFromConfigTable:table; ! 237: ! 238: /* ! 239: * Allocates resource objects for a device description. ! 240: * Returns the device description. ! 241: */ ! 242: - allocateResourcesForDeviceDescription:descr; ! 243: ! 244: - _insertResource: object withKey: (const char *)key; ! 245: - _deleteResourceWithKey: (const char *)key; ! 246: - _lookupResourceWithKey: (const char *)key; ! 247: ! 248: + registerBusClass:busClass name:(char *)name; ! 249: + registerBusInstance:busInstance name:(char *)busName busId:(int)index; ! 250: + lookupBusClassWithName:(char *)name; ! 251: + lookupBusInstanceWithName:(char *)busName busId:(int)index; ! 252: ! 253: /* ! 254: * Returns NO if the bus does not want to configure the driver. ! 255: */ ! 256: + (BOOL)configureDriverWithTable:configTable; ! 257: ! 258: - (int)busId; ! 259: - (void)setBusId:(int)busId; ! 260: ! 261: /* ! 262: * Called when bus is detected, before drivers are probed ! 263: */ ! 264: + (BOOL)probeBus:configTable; ! 265: ! 266: @end ! 267: ! 268: /* ! 269: * Classes which implement ! 270: * hardware bus interrupts ! 271: * must adopt this protocol. ! 272: */ ! 273: ! 274: @protocol KernBusInterrupt ! 275: ! 276: - attachDeviceInterrupt: deviceInterrupt; ! 277: - attachDeviceInterrupt: deviceInterrupt ! 278: atLevel: (int)level; ! 279: - detachDeviceInterrupt: deviceInterrupt; ! 280: ! 281: - suspend; ! 282: - resume; ! 283: ! 284: @end ! 285: ! 286: #endif /* DRIVER_PRIVATE */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.