Annotation of drvEIDE/EIDE.drvproj/EIDE.lksproj/IdeCntInline.h, 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.0 (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 1997-1998 by Apple Computer, Inc., All rights reserved.
        !            26:  * Copyright 1994-1997 NeXT Software, Inc., All rights reserved.
        !            27:  *
        !            28:  * IdeCntInline.h - included by IdeCnt.m -- misc functions
        !            29:  *
        !            30:  * HISTORY 
        !            31:  * 07-Jul-1994  Rakesh Dubey at NeXT
        !            32:  *     Created from original driver written by David Somayajulu.
        !            33:  */
        !            34: 
        !            35: /*
        !            36:  * FIXME: must get rid of this. 
        !            37:  */
        !            38: extern vm_offset_t
        !            39: pmap_resident_extract(
        !            40:     pmap_t             pmap,
        !            41:     vm_offset_t                va
        !            42: );
        !            43: 
        !            44: 
        !            45: static __inline__
        !            46: void
        !            47: outw_fast(
        !            48:     io_addr_t          port,
        !            49:     unsigned short     data
        !            50: )
        !            51: {
        !            52:     asm volatile(
        !            53:        "outw %1,%0"
        !            54:        : 
        !            55:        : "d" (port), "a" (data)
        !            56:        : "cc");
        !            57: }
        !            58: 
        !            59: /*
        !            60:  * This is same as one in standard header files except that the header file
        !            61:  * that gets pulled in has wrong code for this function. FIXME. 10/5/94.
        !            62:  */
        !            63: static __inline__
        !            64: unsigned long
        !            65: inl_mine(
        !            66:     IOEISAPortAddress  port
        !            67: )
        !            68: {
        !            69:     unsigned long      data;
        !            70:     
        !            71:     asm volatile(
        !            72:        "inl %1,%0"
        !            73:        : "=a" (data)
        !            74:        : "d" (port));
        !            75:        
        !            76:     return (data);
        !            77: }
        !            78: 
        !            79: static __inline__
        !            80: void
        !            81: outl_fast(
        !            82:     IOEISAPortAddress  port,
        !            83:     unsigned long      data
        !            84: )
        !            85: {
        !            86:     asm volatile(
        !            87:        "outl %1,%0"
        !            88:        :
        !            89:        : "d" (port), "a" (data)
        !            90:        : "cc");
        !            91: }
        !            92: 
        !            93: static __inline__
        !            94: void 
        !            95: rwBuffer_16(caddr_t addr, BOOL read, unsigned length, 
        !            96:                unsigned ideDataRegister)
        !            97: {
        !            98:     unsigned int len = length;
        !            99:     unsigned short *dst;
        !           100:     
        !           101:     dst = (unsigned short *)addr;
        !           102:     length /= 2;
        !           103:     
        !           104:     if (read) {
        !           105:        while (length-- > 0)
        !           106:            *dst++ = inw(ideDataRegister);
        !           107:     } else {
        !           108:        while (length-- > 0)
        !           109:            outw_fast(ideDataRegister, *dst++);
        !           110:     }
        !           111:     
        !           112:     if (len % 2 == 0)
        !           113:        return;
        !           114: 
        !           115:     /*
        !           116:      * Extra byte. This can happen for ATAPI I/O requests.
        !           117:      */
        !           118:     if (read) {
        !           119:        * (unsigned char *)dst = inw(ideDataRegister);
        !           120:     } else {
        !           121:        outw(ideDataRegister, * (unsigned char *)dst);
        !           122:     }
        !           123: }
        !           124: 
        !           125: /*
        !           126:  * Using 32-bit access.
        !           127:  */
        !           128: static __inline__
        !           129: void 
        !           130: rwBuffer_32(caddr_t addr, BOOL read, unsigned length, 
        !           131:                unsigned ideDataRegister)
        !           132: {
        !           133:     unsigned int len = length;
        !           134:     unsigned int *dst;
        !           135:     
        !           136:     dst = (unsigned int *)addr;
        !           137:     length /= 4;
        !           138:     
        !           139:     if (read) {
        !           140:        while (length-- > 0)
        !           141:            *dst++ = inl_mine(ideDataRegister);
        !           142:     } else {
        !           143:        while (length-- > 0)
        !           144:            outl_fast(ideDataRegister, *dst++);
        !           145:     }
        !           146:     
        !           147:     if (len % 4 == 0)
        !           148:        return;
        !           149: 
        !           150:     /*
        !           151:      * Hand off the remainder to the standard routine. 
        !           152:      */
        !           153:     rwBuffer_16((caddr_t) dst, read, len % 4, ideDataRegister);
        !           154: }
        !           155: 
        !           156: static __inline__
        !           157: void
        !           158: rwBuffer(caddr_t addr, BOOL read, unsigned length,
        !           159:                 unsigned ideDataRegister, ideTransferWidth_t transferWidth)
        !           160: {
        !           161:     if (transferWidth == IDE_TRANSFER_32_BIT)  {
        !           162:         rwBuffer_32(addr, read, length, ideDataRegister);
        !           163:     } else {
        !           164:         rwBuffer_16(addr, read, length, ideDataRegister);
        !           165:     }
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Note: length is <= PAGE_SIZE while calling this function. If a request is
        !           170:  * of odd size and is split over two pages then we always make the second one
        !           171:  * odd sized. 
        !           172:  */
        !           173: 
        !           174: static  __inline__
        !           175: void    
        !           176: ideXferData(caddr_t addr, BOOL read, struct vm_map *client,
        !           177:            unsigned length, ideRegsAddrs_t ideRegs, 
        !           178:            ideTransferWidth_t transferWidth)
        !           179: {
        !           180:     unsigned count, offset;
        !           181:     unsigned short sw;
        !           182:     extern struct vm_map *kernel_map;
        !           183:     caddr_t maddr0, maddr1;
        !           184: 
        !           185:     /*
        !           186:      * Simple case, no mapping required. 
        !           187:      */
        !           188:     if (client == kernel_map) {
        !           189:         rwBuffer(addr, read, length, ideRegs.data, transferWidth);
        !           190:                return;
        !           191:     }
        !           192: 
        !           193:     /*
        !           194:      * Get the physical address here. 
        !           195:      */
        !           196:     offset = (unsigned)addr & (PAGE_SIZE - 1);
        !           197:     maddr0 = (caddr_t) pmap_resident_extract(
        !           198:                vm_map_pmap_EXTERNAL((struct vm_map *) client), 
        !           199:                (vm_offset_t) addr);
        !           200:                    
        !           201:     if ((PAGE_SIZE - offset) < length) {       /* this is a pain */
        !           202:        count = PAGE_SIZE - offset;
        !           203:        maddr1 = (caddr_t) pmap_resident_extract(
        !           204:                    vm_map_pmap_EXTERNAL((struct vm_map *) client),
        !           205:                    (vm_offset_t) addr + count);
        !           206:        if (count % 2) {
        !           207:             rwBuffer((unsigned char *)pmap_phys_to_kern(maddr0),
        !           208:                             read, (count - 1), ideRegs.data, transferWidth);
        !           209:            
        !           210:            if (read) {
        !           211:                sw = inw(ideRegs.data);
        !           212:                *((unsigned char *)pmap_phys_to_kern(maddr0 + count - 1)) =
        !           213:                    (unsigned char)(sw & 0xff);
        !           214:                *((unsigned char *)pmap_phys_to_kern(maddr1)) = 
        !           215:                        (unsigned char)((sw & 0xff) >> 8);
        !           216:            } else {
        !           217:                sw = *((unsigned char *)pmap_phys_to_kern(maddr0+count - 1));
        !           218:                sw |= *((unsigned char *)pmap_phys_to_kern(maddr1)) << 8;
        !           219:                outw_fast(ideRegs.data, sw);
        !           220:            }
        !           221:            maddr1++;
        !           222:             rwBuffer((unsigned char *)pmap_phys_to_kern(maddr1),
        !           223:                             read, (length - count - 1), 
        !           224:                            ideRegs.data, transferWidth);
        !           225:        } else {
        !           226:             rwBuffer((unsigned char *)pmap_phys_to_kern(maddr0),
        !           227:                             read, count, ideRegs.data, transferWidth);
        !           228:             rwBuffer((unsigned char *)pmap_phys_to_kern(maddr1),
        !           229:                             read, (length - count), 
        !           230:                            ideRegs.data, transferWidth);
        !           231:        }
        !           232:     } else {
        !           233:         rwBuffer((unsigned char *) pmap_phys_to_kern(maddr0),
        !           234:                         read, length, ideRegs.data, transferWidth);
        !           235:     }
        !           236: }

unix.superglobalmegacorp.com

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