/* * * (c) 2004 Laurent Vivier * * some parts from BootX, (c) Benjamin Herrenschmidt * */ #include "misc.h" #include "glue.h" #include "arch.h" #include "lowmem.h" #ifdef ARCH_PPC #include "bootx.h" #endif unsigned long cpu_type; unsigned long mmu_type; unsigned long fpu_type; unsigned long machine_id; unsigned long arch_type; #ifdef ARCH_PPC unsigned long bus_type; #endif void arch_init() { /* System prior to 6.0.4 doesn't support Gestalt() */ if (ROMBase[4] == 0x0178) { /* Macintosh SE/30 */ /* Doesn't support Gestalt(), nor SysEnvirons() (why ?) */ /* http://docs.info.apple.com/article.html?artnum=112170 */ cpu_type = gestalt68030; mmu_type = gestalt68030MMU; fpu_type = gestalt68882; machine_id = gestaltMacSE030; arch_type = gestalt68k; return; } /* get processor type */ Gestalt(gestaltProcessorType, &cpu_type); /* check FPU */ if (Gestalt('FPUE', &fpu_type) == noErr) fpu_type = 0; else Gestalt(gestaltFPUType, &fpu_type); /* check MMU */ Gestalt(gestaltMMUType, &mmu_type); /* I'v got a 'noMMU' with my 68030, not cool... */ if (mmu_type == gestaltNoMMU) { switch(cpu_type) { case gestalt68030: mmu_type = gestalt68030MMU; break; case gestalt68040: mmu_type = gestalt68040MMU; break; } } /* get architecture type: powerPC or m68k */ if (Gestalt(gestaltSysArchitecture, &arch_type) != noErr) arch_type = gestalt68k; /* check machine type */ Gestalt(gestaltMachineType, &machine_id); #ifdef ARCH_PPC /* check bus type */ if (arch_type == gestaltPowerPC) { unsigned long response; /* OpenFirmware implies PCI */ if ( (Gestalt('opfw', &response) == noErr) && (Gestalt('nreg', &response) == noErr) ) bus_type = BOOT_ARCH_PCI; else bus_type = BOOT_ARCH_NUBUS; switch(machine_id) { case gestaltPowerMac6100_60: case gestaltPowerMac6100_66: case gestaltPowerMac6100_80: case gestaltPowerMac7100_66: case gestaltPowerMac7100_80: case gestaltPowerMac7100_80_chipped: case gestaltPowerMac8100_80: case gestaltPowerMac8100_100: case gestaltPowerMac8100_110: case gestaltPowerMac8100_120: case gestaltAWS9150_80: case gestaltAWS9150_120: bus_type |= BOOT_ARCH_NUBUS_PDM; break; case gestaltPowerMac5200: case gestaltPowerMac6200: bus_type |= BOOT_ARCH_NUBUS_PERFORMA; break; case gestaltPowerBook1400: case gestaltPowerBook5300: case gestaltPowerBookDuo2300: bus_type |= BOOT_ARCH_NUBUS_POWERBOOK; break; } } #endif }