Annotation of XNU/pexpert/ppc/pe_identify_machine.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: #include <pexpert/protos.h>
        !            23: #include <pexpert/pexpert.h>
        !            24: #include <pexpert/ppc/powermac.h>
        !            25: #include <pexpert/ppc/powermac_pci.h>
        !            26: #include <pexpert/device_tree.h>
        !            27: 
        !            28: /* Local declarations */
        !            29: void           pe_identify_machine(void);
        !            30: int            get_clock_frequency(void);
        !            31: int            init_powermac_machine_info(void);
        !            32: 
        !            33: /* External declarations */
        !            34: 
        !            35: unsigned int LockTimeOut = 12500000;
        !            36: 
        !            37: /* pe_identify_machine:
        !            38:  *
        !            39:  *   Sets up platform parameters.
        !            40:  *   Returns:    nothing
        !            41:  */
        !            42: void pe_identify_machine(void)
        !            43: {
        !            44:        unsigned int dec_rate;
        !            45:        union {
        !            46:          unsigned long fixed;
        !            47:          unsigned char top;
        !            48:        } tmp_fixed;
        !            49: 
        !            50:        /* Everything starts out zeroed... */
        !            51:        bzero((void *)&powermac_info,         sizeof(powermac_info_t));
        !            52: 
        !            53:        powermac_info.struct_version    = POWERMAC_INFO_VERSION;
        !            54: 
        !            55:        /* 
        !            56:         * First, find out everything we can from the device tree.
        !            57:         * 
        !            58:         */
        !            59: 
        !            60:        powermac_info.bus_clock_rate_hz     = get_clock_frequency();
        !            61: 
        !            62:        LockTimeOut = powermac_info.bus_clock_rate_hz >> 4;             /* XXX */
        !            63: 
        !            64:        powermac_info.proc_clock_to_nsec_numerator   = 100000 * 4;
        !            65:        powermac_info.proc_clock_to_nsec_denominator = powermac_info.bus_clock_rate_hz / 10000;
        !            66: 
        !            67:            dec_rate = powermac_info.bus_clock_rate_hz / 4;
        !            68:            // Do the lower 24 bits (ie the remainder * 1_Fixed / dec_rate)
        !            69:            tmp_fixed.fixed =
        !            70:              ((1000000000 % dec_rate) << 24) / dec_rate;
        !            71: 
        !            72:            // Do the top 8 bits (ie the whole part of the number)
        !            73:            tmp_fixed.top = 1000000000 / dec_rate;
        !            74: 
        !            75:        powermac_info.dec_clock_period = tmp_fixed.fixed;
        !            76: 
        !            77:        init_powermac_machine_info();
        !            78: 
        !            79:        //powermac_info.io_coherent  = powermac_is_coherent();
        !            80:        powermac_info.io_coherent  = 1;
        !            81: }
        !            82: 
        !            83: int pe_map_physical_range( vm_offset_t phys, unsigned int size,
        !            84:                int findSpace, int cache, vm_offset_t * virt)
        !            85: {
        !            86: 
        !            87:        *virt = io_map( phys, size);
        !            88: 
        !            89:        return( 0);
        !            90: }
        !            91: 
        !            92: 
        !            93: /* get_io_base_addr():
        !            94:  *
        !            95:  *   Get the base address of the io controller.  
        !            96:  */
        !            97: vm_offset_t get_io_base_addr(void)
        !            98: {
        !            99:        DTEntry         entryP;
        !           100:        vm_offset_t     *address;
        !           101:        int             size;
        !           102: 
        !           103:        if( (DTFindEntry("device_type", "dbdma", &entryP) == kSuccess)
        !           104:         || (DTFindEntry("device_type", "mac-io", &entryP) == kSuccess))
        !           105:        {
        !           106:            if (DTGetProperty(entryP, "AAPL,address", (void **)&address, &size) == kSuccess)
        !           107:                    return(*address);
        !           108: 
        !           109:            if (DTGetProperty(entryP, "assigned-addresses", (void **)&address, &size) == kSuccess)
        !           110:                    // address calculation not correct
        !           111:                    return(*(address+2));
        !           112:        }
        !           113:        
        !           114:        panic("Uhmmm.. I can't get this machine's io base address\n");
        !           115:        return( 0 );
        !           116: }
        !           117: 
        !           118: boolean_t PE_init_ethernet_debugger( void )
        !           119: {
        !           120:        DTEntry         entryP;
        !           121:        vm_offset_t   * address;
        !           122:        unsigned char * netAddr;
        !           123:        int             size;
        !           124:        vm_offset_t     io;
        !           125:        boolean_t       result;
        !           126: 
        !           127:        if( (io = get_io_base_addr())
        !           128:         && (DTFindEntry("name", "mace", &entryP) == kSuccess)
        !           129:         && (DTGetProperty(entryP, "local-mac-address", (void **)&netAddr, &size) == kSuccess)
        !           130:         && (DTGetProperty(entryP, "reg", (void **)&address, &size) == kSuccess)
        !           131:         && (size == (2 * 3 * sizeof(vm_offset_t)) ))
        !           132:         {
        !           133:             extern boolean_t kdp_mace_init( void * baseAddresses[3],
        !           134:                                                unsigned char * netAddr );
        !           135:            void * maceAddrs[3];
        !           136: 
        !           137:             // address calculation not correct
        !           138:            maceAddrs[0] = (void *) io_map(io + address[0], address[1]);
        !           139:            maceAddrs[1] = (void *) io_map(io + address[2], 0x1000);
        !           140:            maceAddrs[2] = (void *) (((vm_offset_t)maceAddrs[1])
        !           141:                                        + address[4] - address[2]);
        !           142:             result = kdp_mace_init( maceAddrs, netAddr );
        !           143: 
        !           144:        } else
        !           145:             result = FALSE;
        !           146:        
        !           147:        return( result );
        !           148: }
        !           149: 
        !           150: vm_offset_t PE_find_scc( void )
        !           151: {
        !           152:        vm_offset_t     io;
        !           153:        DTEntry         entryP;
        !           154: 
        !           155:         if( (io = get_io_base_addr())
        !           156:         && (DTFindEntry("name", "escc", &entryP) == kSuccess))
        !           157:             io += PCI_SCC_OFFSET_PHYS;
        !           158:        else
        !           159:             io = 0;
        !           160: 
        !           161:        return( io );
        !           162: }
        !           163: 
        !           164: /* get_clock_frequency():
        !           165:  *
        !           166:  *   Get the clock freq
        !           167:  */
        !           168: int get_clock_frequency()
        !           169: {
        !           170:        DTEntry         entry;
        !           171:        int             *freq;
        !           172:        int             size;
        !           173: 
        !           174:        if (DTLookupEntry(0, "/", &entry) == kSuccess)
        !           175:            if (DTGetProperty(entry, "clock-frequency", (void **)&freq, &size) == kSuccess)
        !           176:                    return(*freq);
        !           177: 
        !           178:        return(50000000);               // 50 MHz default
        !           179: }
        !           180: 
        !           181: int
        !           182: init_powermac_machine_info(void)
        !           183: {
        !           184:     DTEntry     entry;
        !           185:        int     *value;
        !           186:        int     size;
        !           187: 
        !           188:        value = (int *)0;
        !           189:        size = 0;
        !           190: 
        !           191:        if (DTFindEntry("device_type", "cpu", &entry) == kSuccess) {
        !           192:                if (DTGetProperty(entry, "d-cache-block-size",
        !           193:                        (void **)&value, &size) == kSuccess)
        !           194:                        powermac_info.dcache_block_size = *value;
        !           195: 
        !           196:                if (DTGetProperty(entry, "d-cache-size",
        !           197:                        (void **)&value, &size) == kSuccess)
        !           198:                        powermac_info.dcache_size = *value;
        !           199: 
        !           200:                if (DTGetProperty(entry, "i-cache-size",
        !           201:                        (void **)&value, &size) == kSuccess)
        !           202:                        powermac_info.icache_size = *value;
        !           203: 
        !           204:                if (DTGetProperty(entry, "cpu-version",
        !           205:                        (void **)&value, &size) == kSuccess)
        !           206:                        powermac_info.processor_version = *value;
        !           207: 
        !           208:                if (DTGetProperty(entry, "clock-frequency",
        !           209:                        (void **)&value, &size) == kSuccess)
        !           210:                        powermac_info.cpu_clock_rate_hz = *value;
        !           211:                else powermac_info.cpu_clock_rate_hz = 300000000;
        !           212: 
        !           213:                if (DTGetProperty(entry, "timebase-frequency",
        !           214:                        (void **)&value, &size) == kSuccess)
        !           215:                        powermac_info.dec_clock_rate_hz = *value;
        !           216:                else powermac_info.dec_clock_rate_hz = 25000000;
        !           217: 
        !           218:                if (DTGetProperty(entry, "bus-frequency",
        !           219:                        (void **)&value, &size) == kSuccess)
        !           220:                        powermac_info.bus_clock_rate_num = *value;
        !           221:                else powermac_info.bus_clock_rate_num = get_clock_frequency();
        !           222: 
        !           223:        } else
        !           224:                return 1;
        !           225: 
        !           226:        powermac_info.bus_clock_rate_den = 1;
        !           227: 
        !           228:        powermac_info.bus_to_dec_rate_num = 1;
        !           229:        powermac_info.bus_to_dec_rate_den = powermac_info.bus_clock_rate_num /
        !           230:          powermac_info.dec_clock_rate_hz;
        !           231: 
        !           232:        powermac_info.bus_to_cpu_rate_num =
        !           233:          (2 * powermac_info.cpu_clock_rate_hz) /
        !           234:          powermac_info.bus_clock_rate_num;
        !           235:        powermac_info.bus_to_cpu_rate_den = 2;
        !           236: 
        !           237:        if (DTFindEntry("device_type", "cache", &entry) == kSuccess) {
        !           238:                if (DTGetProperty(entry, "cache-unified",
        !           239:                        (void **)&value, &size) == kSuccess)
        !           240:                        powermac_info.caches_unified = 1;
        !           241:        } else
        !           242:                return 1;
        !           243: 
        !           244:        return 0;
        !           245: }

unix.superglobalmegacorp.com

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