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 36e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuochar cmd_line[COMMAND_LINE_SIZE]; 37e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; 38e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 39e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuoint on_simulator; 40e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 417ddc839977cf4aa2c643a2f0405aa79daa72dc07Paul Gortmakervoid calibrate_delay(void) 42e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 43e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo loops_per_jiffy = thread_freq_mhz * 1000000 / HZ; 44e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 45e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 46e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 47e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * setup_arch - high level architectural setup routine 48e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * @cmdline_p: pointer to pointer to command-line arguments 49e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 50e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 51e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuovoid __init setup_arch(char **cmdline_p) 52e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 53e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo char *p = &external_cmdline_buffer; 54e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 55e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 56e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * These will eventually be pulled in via either some hypervisor 57e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * or devicetree description. Hardwiring for now. 58e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 59e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo pcycle_freq_mhz = 600; 60e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo thread_freq_mhz = 100; 61e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo sleep_clk_freq = 32000; 62e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 63e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 64e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Set up event bindings to handle exceptions and interrupts. 65e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 66e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo __vmsetvec(_K_VM_event_vector); 67e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 688f5a0b9dffeb3cb94f2b0622b6fe0717512ef54bRichard Kuo printk(KERN_INFO "PHYS_OFFSET=0x%08x\n", PHYS_OFFSET); 698f5a0b9dffeb3cb94f2b0622b6fe0717512ef54bRichard Kuo 70e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 71e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Simulator has a few differences from the hardware. 72e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * For now, check uninitialized-but-mapped memory 73e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * prior to invoking setup_arch_memory(). 74e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 75e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo if (*(int *)((unsigned long)_end + 8) == 0x1f1f1f1f) 76e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo on_simulator = 1; 77e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo else 78e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo on_simulator = 0; 79e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 80e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo if (p[0] != '\0') 81e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(boot_command_line, p, COMMAND_LINE_SIZE); 82e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo else 83e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(boot_command_line, default_command_line, 84e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo COMMAND_LINE_SIZE); 85e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 86e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo /* 87e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * boot_command_line and the value set up by setup_arch 88e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * are both picked up by the init code. If no reason to 89e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * make them different, pass the same pointer back. 90e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 91e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); 92e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo *cmdline_p = cmd_line; 93e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 94e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo parse_early_param(); 95e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 96e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo setup_arch_memory(); 97e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 98e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#ifdef CONFIG_SMP 99e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo smp_start_cpus(); 100e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo#endif 101e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 102e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 103e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 104e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Functions for dumping CPU info via /proc 105e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Probably should move to kernel/proc.c or something. 106e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 107e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void *c_start(struct seq_file *m, loff_t *pos) 108e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 109e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return *pos < nr_cpu_ids ? (void *)((unsigned long) *pos + 1) : NULL; 110e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 111e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 112e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void *c_next(struct seq_file *m, void *v, loff_t *pos) 113e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 114e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo ++*pos; 115e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return c_start(m, pos); 116e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 117e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 118e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic void c_stop(struct seq_file *m, void *v) 119e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 120e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 121e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 122e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo/* 123e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * Eventually this will dump information about 124e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo * CPU properties like ISA level, TLB size, etc. 125e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo */ 126e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuostatic int show_cpuinfo(struct seq_file *m, void *v) 127e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo{ 128e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo int cpu = (unsigned long) v - 1; 129e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 1302b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo#ifdef CONFIG_SMP 1312b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo if (!cpu_online(cpu)) 1322b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo return 0; 1332b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo#endif 1342b3c744c3bcaab14ad2cc0f067d76c2f119085a5Richard Kuo 135e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "processor\t: %d\n", cpu); 136e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "model name\t: Hexagon Virtual Machine\n"); 137e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "BogoMips\t: %lu.%02lu\n", 138e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo (loops_per_jiffy * HZ) / 500000, 139e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo ((loops_per_jiffy * HZ) / 5000) % 100); 140e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo seq_printf(m, "\n"); 141e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo return 0; 142e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo} 143e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo 144e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuoconst struct seq_operations cpuinfo_op = { 145e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .start = &c_start, 146e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .next = &c_next, 147e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .stop = &c_stop, 148e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo .show = &show_cpuinfo, 149e03167b26b7fcffea11e82f5672472a23a88ffbcRichard Kuo}; 150