unsigned long load_kernel(unsigned long load_addr, int num_words, unsigned long cksum, RESIDUAL *residual, void *OFW) { int start_multi = 0; unsigned int pci_viddid, pci_did, tulip_pci_base, tulip_base; /* If we have Open Firmware, initialise it immediately */ if (OFW) { OFW_interface = OFW; ofinit(OFW_interface); } board_isa_init(); #if defined(CONFIG_VGA_CONSOLE) vga_init((unsigned char *)0xC0000000); #endif /* CONFIG_VGA_CONSOLE */ if (residual) { /* Is this Motorola PPCBug? */ if ((1 & residual->VitalProductData.FirmwareSupports) && (1 == residual->VitalProductData.FirmwareSupplier)) { unsigned char base_mod; unsigned char board_type = inb(0x801) & 0xF0; /* * Reset the onboard 21x4x Ethernet * Motorola Ethernet is at IDSEL 14 (devfn 0x70) */ pci_read_config_32(0x70, 0x00, &pci_viddid); pci_did = (pci_viddid & 0xffff0000) >> 16; /* Be sure we've really found a 21x4x chip */ if (((pci_viddid & 0xffff) == PCI_VENDOR_ID_DEC) && ((pci_did == PCI_DEVICE_ID_DEC_TULIP_FAST) || (pci_did == PCI_DEVICE_ID_DEC_TULIP) || (pci_did == PCI_DEVICE_ID_DEC_TULIP_PLUS) || (pci_did == PCI_DEVICE_ID_DEC_21142))) { pci_read_config_32(0x70, 0x10, &tulip_pci_base); /* Get the physical base address */ tulip_base = (tulip_pci_base & ~0x03UL) + 0x80000000; /* Strobe the 21x4x reset bit in CSR0 */ writel(0x1, tulip_base); } /* If this is genesis 2 board then check for no * keyboard controller and more than one processor. */ if (board_type == 0xe0) { base_mod = inb(0x803); /* if a MVME2300/2400 or a Sitka then no keyboard */ if((base_mod == 0xFA) || (base_mod == 0xF9) || (base_mod == 0xE1)) { keyb_present = 0; /* no keyboard */ } } /* If this is a multiprocessor system then * park the other processor so that the * kernel knows where to find them. */ if (residual->MaxNumCpus > 1) start_multi = 1; } memcpy(hold_residual,residual,sizeof(RESIDUAL)); }
unsigned long decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum, RESIDUAL *residual, void *OFW_interface) { #ifdef INTERACTIVE_CONSOLE int timer = 0; char ch; #endif extern unsigned long start; char *cp; /* Default to 32MiB memory. */ unsigned long TotalMemory = 0x02000000; int dev_handle; int mem_info[2]; int res, size; unsigned char board_type; unsigned char base_mod; int start_multi = 0; unsigned int pci_viddid, pci_did, tulip_pci_base, tulip_base; serial_fixups(); com_port = serial_init(0, NULL); #if defined(CONFIG_VGA_CONSOLE) vga_init((unsigned char *)0xC0000000); #endif /* CONFIG_VGA_CONSOLE */ /* * Tell the user where we were loaded at and where we were relocated * to for debugging this process. */ puts("loaded at: "); puthex(load_addr); puts(" "); puthex((unsigned long)(load_addr + (4*num_words))); puts("\n"); if ( (unsigned long)load_addr != (unsigned long)&start ) { puts("relocated to: "); puthex((unsigned long)&start); puts(" "); puthex((unsigned long)((unsigned long)&start + (4*num_words))); puts("\n"); } if (residual) { /* * Tell the user where the residual data is. */ puts("board data at: "); puthex((unsigned long)residual); puts(" "); puthex((unsigned long)((unsigned long)residual + sizeof(RESIDUAL))); puts("\nrelocated to: ");puthex((unsigned long)hold_residual); puts(" "); puthex((unsigned long)((unsigned long)hold_residual + sizeof(RESIDUAL))); puts("\n"); /* Is this Motorola PPCBug? */ if ((1 & residual->VitalProductData.FirmwareSupports) && (1 == residual->VitalProductData.FirmwareSupplier)) { board_type = inb(0x800) & 0xF0; /* * Reset the onboard 21x4x Ethernet * Motorola Ethernet is at IDSEL 14 (devfn 0x70) */ pci_read_config_32(0x70, 0x00, &pci_viddid); pci_did = (pci_viddid & 0xffff0000) >> 16; /* Be sure we've really found a 21x4x chip */ if (((pci_viddid & 0xffff) == PCI_VENDOR_ID_DEC) && ((pci_did == PCI_DEVICE_ID_DEC_TULIP_FAST) || (pci_did == PCI_DEVICE_ID_DEC_TULIP) || (pci_did == PCI_DEVICE_ID_DEC_TULIP_PLUS) || (pci_did == PCI_DEVICE_ID_DEC_21142))) { pci_read_config_32(0x70, 0x10, &tulip_pci_base); /* Get the physical base address */ tulip_base = (tulip_pci_base & ~0x03UL) + 0x80000000; /* Strobe the 21x4x reset bit in CSR0 */ writel(0x1, tulip_base); } /* If this is genesis 2 board then check for no * keyboard controller and more than one processor. */ if (board_type == 0xe0) { base_mod = inb(0x803); /* if a MVME2300/2400 or a Sitka then no keyboard */ if((base_mod == 0xFA) || (base_mod == 0xF9) || (base_mod == 0xE1)) { keyb_present = 0; /* no keyboard */ } } /* If this is a multiprocessor system then * park the other processor so that the * kernel knows where to find them. */ if (residual->MaxNumCpus > 1) start_multi = 1; } memcpy(hold_residual,residual,sizeof(RESIDUAL)); /* Copy the memory info. */ if (residual->TotalMemory) TotalMemory = residual->TotalMemory; } else {