setup.c revision 7ddc839977cf4aa2c643a2f0405aa79daa72dc07
1e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 2e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Arch related setup for Hexagon 3e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * 47c6a5df44fd90a288fe067581c5564859c071fc0Richard Kuo * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 5e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * 6e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * This program is free software; you can redistribute it and/or modify 7e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * it under the terms of the GNU General Public License version 2 and 8e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * only version 2 as published by the Free Software Foundation. 9e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * 10e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * This program is distributed in the hope that it will be useful, 11e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of 12e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * GNU General Public License for more details. 14e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * 15e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * You should have received a copy of the GNU General Public License 16e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * along with this program; if not, write to the Free Software 17e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * 02110-1301, USA. 19e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 20e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 21e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/init.h> 22e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/bootmem.h> 23e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/mmzone.h> 24e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/mm.h> 25e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/seq_file.h> 26e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/console.h> 27e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <linux/of_fdt.h> 28e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/io.h> 29e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/sections.h> 30e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/setup.h> 31e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/processor.h> 32e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/hexagon_vm.h> 33e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/vm_mmu.h> 34e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/time.h> 35e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#ifdef CONFIG_OF 36e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#include <asm/prom.h> 37e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#endif 38e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 39e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuochar cmd_line[COMMAND_LINE_SIZE]; 40e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; 41e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 42e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuoint on_simulator; 43e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 447ddc839977cf4aa2c643a2f0405aa79daa72dc07Paul Gortmakervoid calibrate_delay(void) 45e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 46e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo loops_per_jiffy = thread_freq_mhz * 1000000 / HZ; 47e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 48e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 49e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 50e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * setup_arch - high level architectural setup routine 51e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * @cmdline_p: pointer to pointer to command-line arguments 52e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 53e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 54e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuovoid __init setup_arch(char **cmdline_p) 55e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 56e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo char *p = &external_cmdline_buffer; 57e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 58e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 59e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * These will eventually be pulled in via either some hypervisor 60e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * or devicetree description. Hardwiring for now. 61e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 62e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo pcycle_freq_mhz = 600; 63e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo thread_freq_mhz = 100; 64e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo sleep_clk_freq = 32000; 65e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 66e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 67e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Set up event bindings to handle exceptions and interrupts. 68e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 69e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo __vmsetvec(_K_VM_event_vector); 70e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 718f5a0b9dffeb3cb94f2b0622b6fe0717512ef54bRichard Kuo printk(KERN_INFO "PHYS_OFFSET=0x%08x\n", PHYS_OFFSET); 728f5a0b9dffeb3cb94f2b0622b6fe0717512ef54bRichard Kuo 73e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 74e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Simulator has a few differences from the hardware. 75e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * For now, check uninitialized-but-mapped memory 76e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * prior to invoking setup_arch_memory(). 77e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 78e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo if (*(int *)((unsigned long)_end + 8) == 0x1f1f1f1f) 79e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo on_simulator = 1; 80e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo else 81e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo on_simulator = 0; 82e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 83e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo if (p[0] != '\0') 84e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(boot_command_line, p, COMMAND_LINE_SIZE); 85e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo else 86e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(boot_command_line, default_command_line, 87e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo COMMAND_LINE_SIZE); 88e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 89e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 90e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * boot_command_line and the value set up by setup_arch 91e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * are both picked up by the init code. If no reason to 92e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * make them different, pass the same pointer back. 93e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 94e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); 95e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo *cmdline_p = cmd_line; 96e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 97e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo parse_early_param(); 98e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 99e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo setup_arch_memory(); 100e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 101e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#ifdef CONFIG_SMP 102e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo smp_start_cpus(); 103e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#endif 104e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 105e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 106e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 107e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Functions for dumping CPU info via /proc 108e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Probably should move to kernel/proc.c or something. 109e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 110e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void *c_start(struct seq_file *m, loff_t *pos) 111e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 112e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return *pos < nr_cpu_ids ? (void *)((unsigned long) *pos + 1) : NULL; 113e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 114e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 115e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void *c_next(struct seq_file *m, void *v, loff_t *pos) 116e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 117e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo ++*pos; 118e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return c_start(m, pos); 119e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 120e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 121e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void c_stop(struct seq_file *m, void *v) 122e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 123e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 124e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 125e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 126e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Eventually this will dump information about 127e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * CPU properties like ISA level, TLB size, etc. 128e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 129e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic int show_cpuinfo(struct seq_file *m, void *v) 130e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 131e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo int cpu = (unsigned long) v - 1; 132e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 1332b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo#ifdef CONFIG_SMP 1342b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo if (!cpu_online(cpu)) 1352b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo return 0; 1362b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo#endif 1372b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo 138e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "processor\t: %d\n", cpu); 139e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "model name\t: Hexagon Virtual Machine\n"); 140e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "BogoMips\t: %lu.%02lu\n", 141e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo (loops_per_jiffy * HZ) / 500000, 142e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo ((loops_per_jiffy * HZ) / 5000) % 100); 143e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "\n"); 144e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return 0; 145e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 146e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 147e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuoconst struct seq_operations cpuinfo_op = { 148e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .start = &c_start, 149e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .next = &c_next, 150e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .stop = &c_stop, 151e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .show = &show_cpuinfo, 152e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo}; 153