Annotation of driverkit/libDriver/pci/IOPCIDirectDevice.m, revision 1.1

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 direct device implementation.
        !            28:  *
        !            29:  * HISTORY
        !            30:  *
        !            31:  * 19 Aug 1994  Dean Reece at NeXT
        !            32:  *     Added class methods.
        !            33:  *
        !            34:  * 13 May 1994 Dean Reece at NeXT
        !            35:  *     Created.
        !            36:  *
        !            37:  */
        !            38: 
        !            39: #import <driverkit/i386/PCI.h>
        !            40: #import <driverkit/i386/PCIKernBus.h>
        !            41: #import <driverkit/i386/IOPCIDirectDevice.h>
        !            42: #import <driverkit/i386/IOPCIDeviceDescription.h>
        !            43: #import <driverkit/IODeviceDescription.h>
        !            44: 
        !            45: static inline id
        !            46: getThePCIBus(void)
        !            47: {
        !            48:     return [KernBus lookupBusInstanceWithName:"PCI" busId:0];
        !            49: }
        !            50: 
        !            51: @implementation IODirectDevice(IOPCIDirectDevice)
        !            52: 
        !            53: /*
        !            54:  * Determine whether or not the associated device is connected to a PCI 
        !            55:  * bus. Returns YES if so, else returns NO.
        !            56:  */
        !            57: + (BOOL)isPCIPresent
        !            58: {
        !            59:        id      thePCIBus = getThePCIBus();
        !            60:        
        !            61:        if (thePCIBus == nil) return NO;
        !            62:        return [thePCIBus isPCIPresent];
        !            63: }
        !            64: 
        !            65: - (BOOL)isPCIPresent
        !            66: {
        !            67:        id      thePCIBus = getThePCIBus();
        !            68: 
        !            69:        if (thePCIBus == nil) return NO;
        !            70:        return [thePCIBus isPCIPresent];
        !            71: }
        !            72: 
        !            73: 
        !            74: /*
        !            75:  * Reads the device's entire configuration space.  Returns IO_R_SUCCESS if
        !            76:  * successful.  If this method fails, the driver should make no assumptions
        !            77:  * about the state of the data returned in the IOPCIConfigSpace struct.
        !            78:  */
        !            79: + (IOReturn)getPCIConfigSpace: (IOPCIConfigSpace *) configSpace
        !            80:        withDeviceDescription: descr
        !            81: {
        !            82:        unsigned char   devNum, funNum, busNum;
        !            83:        unsigned long   *ptr;
        !            84:        int             address;
        !            85:        IOReturn        ret;
        !            86:        id      thePCIBus = getThePCIBus();
        !            87: 
        !            88:        if (![self isPCIPresent]) return IO_R_NO_DEVICE;
        !            89: 
        !            90:        ret = [descr getPCIdevice: &devNum function: &funNum bus: &busNum];
        !            91:        if (ret != IO_R_SUCCESS) return ret;
        !            92: 
        !            93:        ptr = (unsigned long *)configSpace;
        !            94:        for (address=0x00; address<0x100; address+=0x04) {
        !            95:                ret = [thePCIBus getRegister: address
        !            96:                                      device: devNum
        !            97:                                    function: funNum
        !            98:                                         bus: busNum
        !            99:                                        data: ptr++];
        !           100:                if (ret != IO_R_SUCCESS) return ret;
        !           101:        }
        !           102:        return IO_R_SUCCESS;    
        !           103: }
        !           104: 
        !           105: - (IOReturn)getPCIConfigSpace: (IOPCIConfigSpace *) configSpace
        !           106: {
        !           107:        return [[self class] getPCIConfigSpace: configSpace
        !           108:                        withDeviceDescription:[self deviceDescription]];
        !           109: }
        !           110: 
        !           111: 
        !           112: /*
        !           113:  * Writes the device's entire configuration space.  Returns IO_R_SUCCESS if
        !           114:  * successful.  If this method fails, the driver should make no assumptions
        !           115:  * about the state of the device's configuration space.
        !           116:  */
        !           117: + (IOReturn)setPCIConfigSpace: (IOPCIConfigSpace *) configSpace
        !           118:        withDeviceDescription: descr
        !           119: {
        !           120:        unsigned char   devNum, funNum, busNum;
        !           121:        unsigned long   *ptr;
        !           122:        int             address;
        !           123:        IOReturn        ret;
        !           124:        id      thePCIBus = getThePCIBus();
        !           125: 
        !           126:        if (![self isPCIPresent]) return IO_R_NO_DEVICE;
        !           127: 
        !           128:        ret = [descr getPCIdevice: &devNum function: &funNum bus: &busNum];
        !           129:        if (ret != IO_R_SUCCESS) return ret;
        !           130: 
        !           131:        ptr = (unsigned long *)configSpace;
        !           132:        for (address=0x00; address<0x100; address+=0x04) {
        !           133:                ret = [thePCIBus setRegister: address
        !           134:                                      device: devNum
        !           135:                                    function: funNum
        !           136:                                         bus: busNum
        !           137:                                        data: *ptr++];
        !           138:                if (ret != IO_R_SUCCESS) return ret;
        !           139:        }
        !           140:        return IO_R_SUCCESS;    
        !           141: }
        !           142: 
        !           143: - (IOReturn)setPCIConfigSpace: (IOPCIConfigSpace *) configSpace
        !           144: {
        !           145:        return [[self class] setPCIConfigSpace: configSpace
        !           146:                        withDeviceDescription:[self deviceDescription]];
        !           147: }
        !           148: 
        !           149: 
        !           150: /*
        !           151:  * Reads from the device's configuration space.  All access are 32 bits wide
        !           152:  * and the address must be aligned as such.
        !           153:  */
        !           154: + (IOReturn)getPCIConfigData: (unsigned long *) data
        !           155:                  atRegister: (unsigned char) address
        !           156:        withDeviceDescription: descr
        !           157: {
        !           158:        unsigned char devNum, funNum, busNum;
        !           159:        IOReturn      ret;
        !           160:        id      thePCIBus = getThePCIBus();
        !           161: 
        !           162:        if (![self isPCIPresent]) return IO_R_NO_DEVICE;
        !           163: 
        !           164:        ret = [descr getPCIdevice: &devNum function: &funNum bus: &busNum];
        !           165:        if (ret != IO_R_SUCCESS) return ret;
        !           166: 
        !           167:        return [thePCIBus getRegister: address
        !           168:                               device: devNum
        !           169:                             function: funNum
        !           170:                                  bus: busNum
        !           171:                                 data: data];
        !           172: }
        !           173: 
        !           174: - (IOReturn)getPCIConfigData: (unsigned long *) data
        !           175:                  atRegister: (unsigned char) address
        !           176: {
        !           177:        return [[self class] getPCIConfigData: data atRegister: address
        !           178:                        withDeviceDescription:[self deviceDescription]];
        !           179: }
        !           180: 
        !           181: 
        !           182: /*
        !           183:  * Writes to the device's configuration space.  All access are 32 bits wide
        !           184:  * and the address must be aligned as such.  This method reads the register
        !           185:  * back after setting it, and returns that value.  If this method fails, it
        !           186:  * will return PCI_DEFAULT_DATA
        !           187:  */
        !           188: + (IOReturn)setPCIConfigData: (unsigned long) data
        !           189:                  atRegister: (unsigned char) address
        !           190:        withDeviceDescription: descr
        !           191: {
        !           192:        unsigned char devNum, funNum, busNum;
        !           193:        IOReturn      ret;
        !           194:        id      thePCIBus = getThePCIBus();
        !           195: 
        !           196:        if (![self isPCIPresent]) return IO_R_NO_DEVICE;
        !           197: 
        !           198:        ret = [descr getPCIdevice: &devNum function: &funNum bus: &busNum];
        !           199:        if (ret != IO_R_SUCCESS) return ret;
        !           200: 
        !           201:        return [thePCIBus setRegister: address
        !           202:                               device: devNum
        !           203:                             function: funNum
        !           204:                                  bus: busNum
        !           205:                                 data: data];
        !           206: }
        !           207: 
        !           208: - (IOReturn)setPCIConfigData: (unsigned long) data
        !           209:                  atRegister: (unsigned char) address
        !           210: {
        !           211:        return [[self class] setPCIConfigData: data atRegister: address
        !           212:                        withDeviceDescription:[self deviceDescription]];
        !           213: }
        !           214: 
        !           215: @end
        !           216: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.