Boolean LookForPCIFrameGrabbers(short model, long* base0, long* base1, long* buffers) { RegEntryID entry; RegEntryIter cookie; RegPropertyValueSize propertySize; Boolean done; char *LG3ID = "pci11ff,1"; char *ScionNodeName; long bases[2]; long *bufPtr; if ((int) RegistryEntryIDInit == kUnresolvedCFragSymbolAddress) return (0); if ((int) RegistryEntryIterateCreate == kUnresolvedCFragSymbolAddress) return (0); if ((int) RegistryEntryIDDispose == kUnresolvedCFragSymbolAddress) return (0); if ((int) RegistryEntrySearch == kUnresolvedCFragSymbolAddress) return (0); if ((int) RegistryEntryIterateDispose == kUnresolvedCFragSymbolAddress) return (0); if ((int) ExpMgrConfigReadLong == kUnresolvedCFragSymbolAddress) return (0); if ((int) ExpMgrConfigWriteByte == kUnresolvedCFragSymbolAddress) return (0); if ((int) SetProcessorCacheMode == kUnresolvedCFragSymbolAddress) return (0); if ((int) SynchronizeIO == kUnresolvedCFragSymbolAddress) return (0); if (RegistryEntryIDInit(&entry) != noErr) return (0); if (RegistryEntryIterateCreate(&cookie) != noErr) { RegistryEntryIDDispose(&entry); return (0); } if (RegistryEntrySearch(&cookie, kRegIterContinue, &entry, &done, "device_type", "pci", sizeof("pci")) != noErr) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } if (done) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } switch (model) { case 1: ScionNodeName = LG3ID; break; default: { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } } if (RegistryEntrySearch(&cookie, kRegIterContinue, &entry, &done, "name", ScionNodeName, sizeof("pci11ff,x")) != noErr) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } if (done) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } if (ExpMgrConfigReadLong(&entry, (LogicalAddress) 16, (UInt32*) (&(bases[0]))) != noErr) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } if (ExpMgrConfigReadLong(&entry, (LogicalAddress) 20, (UInt32*) (&(bases[1]))) != noErr) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } bases[0] &= 0xfff00000; bases[1] &= 0xfc000000; *base0 = bases[0]; *base1 = bases[1]; if ((bases[0] == 0) || (bases[1] == 0)) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } if (ExpMgrConfigWriteByte(&entry, (LogicalAddress) 4, 22) != noErr) { RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); return (0); } RegistryEntryIterateDispose(&cookie); RegistryEntryIDDispose(&entry); if (model == 1) { if (SetProcessorCacheMode(kCurrentAddressSpaceID, (void*) bases[1], 67108864, kProcessorCacheModeInhibited) != noErr) return(0); bufPtr = (long*) (bases[1]); SynchronizeIO(); *bufPtr = 0xa596a596; SynchronizeIO(); bufPtr = (long*) ((long) (bufPtr) + 2 * 524288); if (*bufPtr == 0xa596a596) *buffers = 2; else { bufPtr = (long*) ((long) (bufPtr) + 6 * 524288); if (*bufPtr == 0xa596a596) *buffers = 8; else { bufPtr = (long*) ((long) (bufPtr) + 24 * 524288); if (*bufPtr == 0xa596a596) *buffers = 32; else *buffers = 128; } } if (SetProcessorCacheMode(kCurrentAddressSpaceID, (void*) bases[1], 67108864, kProcessorCacheModeCopyBack) != noErr) return(0); } return (1); }