/* Return amount of RAM in bytes */ long ramsize(void) { static long size = 0; if(!size){ size = probe_memory(RAM_BASE,RAM_MAX_SIZE); } return size; }
int _start(char *boot_args, char *monitor) { unsigned int bootdir_pages; memset(&ka, 0, sizeof(ka)); init_nextmon(monitor); dprintf("\nNewOS stage2: args '%s', monitor %p\n", boot_args, monitor); probe_memory(&ka); dprintf("tc 0x%x\n", get_tc()); dprintf("urp 0x%x\n", get_urp()); dprintf("srp 0x%x\n", get_srp()); // calculate how big the bootdir is { int entry; bootdir_pages = 0; for (entry = 0; entry < BOOTDIR_MAX_ENTRIES; entry++) { if (bootdir[entry].be_type == BE_TYPE_NONE) break; bootdir_pages += bootdir[entry].be_size; } ka.bootdir_addr.start = (unsigned long)bootdir; ka.bootdir_addr.size = bootdir_pages * PAGE_SIZE; dprintf("bootdir: start %p, size 0x%x\n", (char *)ka.bootdir_addr.start, ka.bootdir_addr.size); } // begin to set up the physical page allocation range data structures ka.num_phys_alloc_ranges = 1; ka.phys_alloc_range[0].start = ka.bootdir_addr.start; ka.phys_alloc_range[0].size = ka.bootdir_addr.size; // allocate a stack for the kernel when we jump into it ka.cpu_kstack[0].start = allocate_page(&ka); ka.cpu_kstack[0].size = PAGE_SIZE; ka.num_cpus = 1; return 0; }
void __init sgimc_init(void) { u32 tmp; /* ioremap can't fail */ sgimc = (struct sgimc_regs *) ioremap(SGIMC_BASE, sizeof(struct sgimc_regs)); printk(KERN_INFO "MC: SGI memory controller Revision %d\n", (int) sgimc->systemid & SGIMC_SYSID_MASKREV); /* Place the MC into a known state. This must be done before * interrupts are first enabled etc. */ /* Step 0: Make sure we turn off the watchdog in case it's * still running (which might be the case after a * soft reboot). */ tmp = sgimc->cpuctrl0; tmp &= ~SGIMC_CCTRL0_WDOG; sgimc->cpuctrl0 = tmp; /* Step 1: The CPU/GIO error status registers will not latch * up a new error status until the register has been * cleared by the cpu. These status registers are * cleared by writing any value to them. */ sgimc->cstat = sgimc->gstat = 0; /* Step 2: Enable all parity checking in cpu control register * zero. */ /* don't touch parity settings for IP28 */ tmp = sgimc->cpuctrl0; #ifndef CONFIG_SGI_IP28 tmp |= SGIMC_CCTRL0_EPERRGIO | SGIMC_CCTRL0_EPERRMEM; #endif tmp |= SGIMC_CCTRL0_R4KNOCHKPARR; sgimc->cpuctrl0 = tmp; /* Step 3: Setup the MC write buffer depth, this is controlled * in cpu control register 1 in the lower 4 bits. */ tmp = sgimc->cpuctrl1; tmp &= ~0xf; tmp |= 0xd; sgimc->cpuctrl1 = tmp; /* Step 4: Initialize the RPSS divider register to run as fast * as it can correctly operate. The register is laid * out as follows: * * ---------------------------------------- * | RESERVED | INCREMENT | DIVIDER | * ---------------------------------------- * 31 16 15 8 7 0 * * DIVIDER determines how often a 'tick' happens, * INCREMENT determines by how the RPSS increment * registers value increases at each 'tick'. Thus, * for IP22 we get INCREMENT=1, DIVIDER=1 == 0x101 */ sgimc->divider = 0x101; /* Step 5: Initialize GIO64 arbitrator configuration register. * * NOTE: HPC init code in sgihpc_init() must run before us because * we need to know Guiness vs. FullHouse and the board * revision on this machine. You have been warned. */ /* First the basic invariants across all GIO64 implementations. */ tmp = sgimc->giopar & SGIMC_GIOPAR_GFX64; /* keep gfx 64bit settings */ tmp |= SGIMC_GIOPAR_HPC64; /* All 1st HPC's interface at 64bits */ tmp |= SGIMC_GIOPAR_ONEBUS; /* Only one physical GIO bus exists */ if (ip22_is_fullhouse()) { /* Fullhouse specific settings. */ if (SGIOC_SYSID_BOARDREV(sgioc->sysid) < 2) { tmp |= SGIMC_GIOPAR_HPC264; /* 2nd HPC at 64bits */ tmp |= SGIMC_GIOPAR_PLINEEXP0; /* exp0 pipelines */ tmp |= SGIMC_GIOPAR_MASTEREXP1; /* exp1 masters */ tmp |= SGIMC_GIOPAR_RTIMEEXP0; /* exp0 is realtime */ } else { tmp |= SGIMC_GIOPAR_HPC264; /* 2nd HPC 64bits */ tmp |= SGIMC_GIOPAR_PLINEEXP0; /* exp[01] pipelined */ tmp |= SGIMC_GIOPAR_PLINEEXP1; tmp |= SGIMC_GIOPAR_MASTEREISA; /* EISA masters */ } } else { /* Guiness specific settings. */ tmp |= SGIMC_GIOPAR_EISA64; /* MC talks to EISA at 64bits */ tmp |= SGIMC_GIOPAR_MASTEREISA; /* EISA bus can act as master */ } sgimc->giopar = tmp; /* poof */ probe_memory(); }