|
|
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: * Copyright (c) 1994 NeXT Computer, Inc.
26: *
27: * PCMCIA direct device implementation.
28: *
29: * HISTORY
30: *
31: * 17 May 1994 Curtis Galloway at NeXT
32: * Created.
33: *
34: *
35: */
36:
37: #define KERNEL_PRIVATE 1
38:
39: #import <driverkit/i386/IOPCMCIADirectDevice.h>
40: #import <driverkit/IODirectDevicePrivate.h>
41:
42: #import <driverkit/KernDeviceDescription.h>
43: #import <driverkit/i386/PCMCIAKernBus.h>
44: #import <driverkit/KernBusMemory.h>
45: #import <driverkit/KernDevice.h>
46: #import <driverkit/KernDeviceDescription.h>
47: #import <driverkit/i386/PCMCIAPool.h>
48:
49: #define ATTRIBUTE_MAPPING_KEY "PCMCIA_DEVICE_ATTR_MAPPING"
50:
51: @implementation IODirectDevice(IOPCMCIADirectDevice)
52:
53: - (IOReturn) mapAttributeMemoryTo:(vm_address_t *) destAddr
54: findSpace:(BOOL) findSpace
55: {
56: struct _eisa_private *private = _busPrivate;
57: id mapping, mappingList;
58: id resource;
59: id socketElement;
60: id memWindowElement, memWindow;
61: id windowList;
62: Range memRange;
63: id thePCMCIABus;
64:
65: thePCMCIABus = [KernBus lookupBusInstanceWithName:"PCMCIA" busId:0];
66:
67: if ([_deviceDescriptionDelegate
68: resourcesForKey:ATTRIBUTE_MAPPING_KEY]) {
69: return IO_R_BUSY;
70: }
71: /* Get memory window */
72: socketElement = [[_deviceDescriptionDelegate
73: resourcesForKey:PCMCIA_SOCKET_LIST] objectAt:0];
74: if (socketElement == nil)
75: return IO_R_RESOURCE;
76: memWindowElement = [thePCMCIABus allocMemoryWindowForSocket:
77: [socketElement object]];
78: if (memWindowElement == nil)
79: return IO_R_RESOURCE;
80: windowList = [_deviceDescriptionDelegate
81: resourcesForKey:PCMCIA_WINDOW_LIST];
82:
83: resource = [thePCMCIABus memoryRangeResource];
84:
85: if (findSpace)
86: mapping =
87: [resource mapInTarget:current_task_EXTERNAL()
88: cache:NO];
89: else
90: mapping =
91: [resource mapToAddress:*destAddr
92: inTarget:current_task_EXTERNAL()
93: cache:NO];
94:
95: if (mapping == nil) {
96: [memWindowElement free];
97: return IO_R_NO_MEMORY;
98: }
99:
100: *destAddr = [mapping address];
101:
102: mappingList = [[List alloc] initCount:1];
103: [mappingList addObject:mapping];
104: [_deviceDescriptionDelegate
105: setResources:mappingList forKey:ATTRIBUTE_MAPPING_KEY];
106:
107: memWindow = [memWindowElement object];
108: memRange = [resource range];
109: [memWindow setEnabled:NO];
110: [memWindow setMemoryInterface:YES];
111: [memWindow setAttributeMemory:YES];
112: [memWindow setMapWithSize:memRange.length
113: systemAddress:memRange.base cardAddress:0];
114: [memWindow setEnabled:YES];
115: [[memWindow socket] setMemoryInterface:YES];
116:
117: [windowList addObject:memWindowElement];
118:
119: return IO_R_SUCCESS;
120: }
121:
122: - (void) unmapAttributeMemory
123: {
124: struct _eisa_private *private = _busPrivate;
125: id windowList;
126: int i;
127:
128: if ([_deviceDescriptionDelegate
129: resourcesForKey:ATTRIBUTE_MAPPING_KEY] == nil)
130: return;
131:
132: /* Find the memory window */
133: windowList = [_deviceDescriptionDelegate
134: resourcesForKey:PCMCIA_WINDOW_LIST];
135:
136: for (i=0; i < [windowList count]; i++) {
137: id window, windowElement;
138:
139: windowElement = [windowList objectAt:i];
140: window = [windowElement object];
141: if ([window memoryInterface] && [window attributeMemory]) {
142: /* Right now there is only one attribute memory window allowed,
143: * so assume this is the right one.
144: */
145: [window setAttributeMemory:NO];
146: [window setEnabled:NO];
147: [[window socket] setMemoryInterface:NO];
148: [windowList removeObject:windowElement];
149: [windowElement free];
150: break;
151: }
152: }
153:
154: /* This will free the mapping */
155: [_deviceDescriptionDelegate
156: removeResourcesForKey:ATTRIBUTE_MAPPING_KEY];
157: }
158:
159: @end
160:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.