|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-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: /* ! 23: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 24: * ! 25: * DRI: Josh de Cesare ! 26: * ! 27: */ ! 28: ! 29: #include <ppc/proc_reg.h> ! 30: ! 31: #include <IOKit/IOLib.h> ! 32: #include <IOKit/IODeviceTreeSupport.h> ! 33: #include <IOKit/IODeviceMemory.h> ! 34: ! 35: #include "KeyLargo.h" ! 36: ! 37: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 38: ! 39: #define super AppleMacIO ! 40: ! 41: OSDefineMetaClassAndStructors(KeyLargo, AppleMacIO); ! 42: ! 43: bool KeyLargo::start(IOService *provider) ! 44: { ! 45: // Call MacIO's start. ! 46: if (!super::start(provider)) ! 47: return false; ! 48: ! 49: // Make nubs for the children. ! 50: publishBelow(provider); ! 51: ! 52: // get the base address of KeyLargo. ! 53: keyLargoBaseAddress = fMemory->getVirtualAddress(); ! 54: ! 55: registerService(); ! 56: ! 57: return true; ! 58: } ! 59: ! 60: ! 61: long long KeyLargo::syncTimeBase(void) ! 62: { ! 63: long cnt; ! 64: unsigned long gtLow, gtHigh, gtHigh2; ! 65: unsigned long tbLow, tbHigh; ! 66: long long tmp, diffTicks, ratioLow, ratioHigh; ! 67: ! 68: ratioLow = (24907667ULL << 32) / kKeyLargoGTimerFreq; ! 69: ratioHigh = ratioLow >> 32; ! 70: ratioLow &= 0xFFFFFFFFULL; ! 71: ! 72: // Save the old time base. ! 73: diffTicks = ((long long)mftbu() << 32) | mftb(); ! 74: ! 75: // Do the sync twice to make sure it is cached. ! 76: for (cnt = 0; cnt < 2; cnt++) { ! 77: // Read the Global Counter. ! 78: do { ! 79: gtHigh = readRegUInt32(kKeyLargoCounterHiOffset); ! 80: gtLow = readRegUInt32(kKeyLargoCounterLoOffset); ! 81: gtHigh2 = readRegUInt32(kKeyLargoCounterHiOffset); ! 82: } while (gtHigh != gtHigh2); ! 83: ! 84: tmp = gtHigh * ratioLow + gtLow * ratioHigh + ! 85: ((gtLow * ratioLow + 0x80000000UL) >> 32); ! 86: tbHigh = gtHigh * ratioHigh + (tmp >> 32); ! 87: tbLow = tmp & 0xFFFFFFFFULL; ! 88: ! 89: mttb(tbLow); ! 90: mttbu(tbHigh); ! 91: } ! 92: ! 93: diffTicks = (((long long)tbHigh << 32) | tbLow) - diffTicks; ! 94: ! 95: return diffTicks; ! 96: } ! 97: ! 98: UInt8 KeyLargo::readRegUInt8(unsigned long offest) ! 99: { ! 100: return *(UInt8 *)(keyLargoBaseAddress + offest); ! 101: } ! 102: ! 103: void KeyLargo::writeRegUInt8(unsigned long offest, UInt8 data) ! 104: { ! 105: *(UInt8 *)(keyLargoBaseAddress + offest) = data; ! 106: eieio(); ! 107: } ! 108: ! 109: UInt32 KeyLargo::readRegUInt32(unsigned long offest) ! 110: { ! 111: return lwbrx(keyLargoBaseAddress + offest); ! 112: } ! 113: ! 114: void KeyLargo::writeRegUInt32(unsigned long offest, UInt32 data) ! 115: { ! 116: stwbrx(data, keyLargoBaseAddress + offest); ! 117: eieio(); ! 118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.