|
|
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: * PCI device description class.
28: *
29: * HISTORY
30: *
31: * 19 Aug 1994 Dean Reece at NeXT
32: * Complete re-write (it was just a placeholder)
33: *
34: * 19 Jul 1994 Curtis Galloway at NeXT
35: * Created.
36: */
37:
38: #define KERNEL_PRIVATE 1
39:
40: #import <driverkit/KernDeviceDescription.h>
41: #import <driverkit/i386/IOPCIDeviceDescription.h>
42: #import <driverkit/i386/IOPCIDeviceDescriptionPrivate.h>
43: #import <driverkit/i386/PCIKernBus.h>
44: #import <driverkit/IODeviceDescriptionPrivate.h>
45: #import <driverkit/i386/directDevice.h>
46:
47: struct _pci_private {
48: BOOL valid;
49: unsigned char devNum, funNum, busNum;
50: };
51:
52: @implementation IOPCIDeviceDescription(Private)
53:
54: /*
55: * Here we init the PCI device description by calling thePCIBus to
56: * decode our configTable and extract the bits necessary to determine
57: * the PCI address. If the thePCIBus object is absent or claims no
58: * PCI bus, then we just set valid to NO.
59: *
60: * XXX Implementation Note: It seems odd that thePCIBus object handles
61: * parsing the configTable, rather than doing it here. This division
62: * of functionality was choosen to allow easy replacement; thePCIBus is
63: * a loadable driver, but IOPCIDeviceDescription is statically linked
64: * into the kernel. If/when the driverkit stuff gets moved to a loadable
65: * module, [thePCIBus configAddress] should be moved here.
66: */
67: - _initWithDelegate:delegate
68: {
69: struct _pci_private *private;
70: id thePCIBus = [KernBus lookupBusInstanceWithName:"PCI" busId:0];
71:
72: [super _initWithDelegate:delegate];
73:
74: _pci_private = (void *)IOMalloc(sizeof(struct _pci_private));
75: private = (struct _pci_private *)_pci_private;
76:
77: private->valid = ( (thePCIBus != nil) &&
78: ([thePCIBus isPCIPresent] == YES) &&
79: ([thePCIBus configAddress: delegate
80: device: &(private->devNum)
81: function: &(private->funNum)
82: bus: &(private->busNum)] == IO_R_SUCCESS)
83: );
84: return self;
85: }
86:
87: @end
88:
89: @implementation IOPCIDeviceDescription
90:
91: - free
92: {
93: struct _pci_private *private = (struct _pci_private *)_pci_private;
94:
95: IOFree(private, sizeof(struct _pci_private));
96: return [super free];
97: }
98:
99: /*
100: * getPCIdevice is the whole purpose for this object. This method allows
101: * callers to get the PCI config address of the PCI device associated
102: * with this device description. If all goes well, the three params are
103: * filled in and IO_R_SUCCESS is returned. There are a variety of reasons
104: * that the address couldn't be known, in which case an appropriate code is
105: * returned and the parameters are left untouched. It is acceptable for any
106: * of the parameter pointers to be NULL.
107: */
108: - (IOReturn) getPCIdevice: (unsigned char *) devNum
109: function: (unsigned char *) funNum
110: bus: (unsigned char *) busNum
111: {
112: struct _pci_private *private = (struct _pci_private *)_pci_private;
113:
114: if (private->valid) {
115: if (devNum) *devNum = private->devNum;
116: if (funNum) *funNum = private->funNum;
117: if (busNum) *busNum = private->busNum;
118: return IO_R_SUCCESS;
119: }
120: return IO_R_NO_DEVICE;
121: }
122:
123: - property_IODeviceType:(char *)types length:(unsigned int *)maxLen
124: {
125: [super property_IODeviceType:types length:maxLen];
126: strcat( types, " "IOTypePCI);
127: return( self);
128: }
129:
130: - property_IOSlotName:(char *)name length:(unsigned int *)maxLen
131: {
132: struct _pci_private *private = (struct _pci_private *)_pci_private;
133:
134: if (private->valid) {
135: sprintf( name, "Dev=%d Func=%d Bus=%d",
136: private->devNum, private->funNum, private->busNum );
137: return self;
138: }
139: return nil;
140: }
141:
142: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.