static int powermac_attach(platform_t plat) { phandle_t rootnode; char model[32]; /* * Quiesce Open Firmware on PowerMac11,2 and 12,1. It is * necessary there to shut down a background thread doing fan * management, and is harmful on other machines (it will make OF * shut off power to various system components it had turned on). * * Note: we don't need to worry about which OF module we are * using since this is called only from very early boot, within * OF's boot context. */ rootnode = OF_finddevice("/"); if (OF_getprop(rootnode, "model", model, sizeof(model)) > 0) { if (strcmp(model, "PowerMac11,2") == 0 || strcmp(model, "PowerMac12,1") == 0) { ofw_quiesce(); } } return (0); }
static int chrp_attach(platform_t plat) { #ifdef __powerpc64__ /* XXX: check for /rtas/ibm,hypertas-functions? */ if (!(mfmsr() & PSL_HV)) { struct mem_region *phys, *avail; int nphys, navail; mem_regions(&phys, &nphys, &avail, &navail); realmaxaddr = phys[0].mr_size; pmap_mmu_install("mmu_phyp", BUS_PROBE_SPECIFIC); cpu_idle_hook = phyp_cpu_idle; /* Set up important VPA fields */ bzero(splpar_vpa, sizeof(splpar_vpa)); splpar_vpa[4] = (uint8_t)((sizeof(splpar_vpa) >> 8) & 0xff); splpar_vpa[5] = (uint8_t)(sizeof(splpar_vpa) & 0xff); splpar_vpa[0xba] = 1; /* Maintain FPRs */ splpar_vpa[0xbb] = 1; /* Maintain PMCs */ splpar_vpa[0xfc] = 0xff; /* Maintain full SLB */ splpar_vpa[0xfd] = 0xff; splpar_vpa[0xff] = 1; /* Maintain Altivec */ mb(); /* Set up hypervisor CPU stuff */ chrp_smp_ap_init(plat); } #endif /* Some systems (e.g. QEMU) need Open Firmware to stand down */ ofw_quiesce(); return (0); }