aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/kernel/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/tile/kernel/setup.c')
-rw-r--r--arch/tile/kernel/setup.c132
1 files changed, 73 insertions, 59 deletions
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
index 934136b61ceb..4dd21c1e6d5e 100644
--- a/arch/tile/kernel/setup.c
+++ b/arch/tile/kernel/setup.c
@@ -20,6 +20,7 @@
#include <linux/node.h>
#include <linux/cpu.h>
#include <linux/ioport.h>
+#include <linux/irq.h>
#include <linux/kexec.h>
#include <linux/pci.h>
#include <linux/initrd.h>
@@ -109,7 +110,7 @@ static int __init setup_maxmem(char *str)
maxmem_pfn = (maxmem_mb >> (HPAGE_SHIFT - 20)) <<
(HPAGE_SHIFT - PAGE_SHIFT);
- printk("Forcing RAM used to no more than %dMB\n",
+ pr_info("Forcing RAM used to no more than %dMB\n",
maxmem_pfn >> (20 - PAGE_SHIFT));
return 0;
}
@@ -127,7 +128,7 @@ static int __init setup_maxnodemem(char *str)
maxnodemem_pfn[node] = (maxnodemem_mb >> (HPAGE_SHIFT - 20)) <<
(HPAGE_SHIFT - PAGE_SHIFT);
- printk("Forcing RAM used on node %ld to no more than %dMB\n",
+ pr_info("Forcing RAM used on node %ld to no more than %dMB\n",
node, maxnodemem_pfn[node] >> (20 - PAGE_SHIFT));
return 0;
}
@@ -140,7 +141,7 @@ static int __init setup_isolnodes(char *str)
return -EINVAL;
nodelist_scnprintf(buf, sizeof(buf), isolnodes);
- printk("Set isolnodes value to '%s'\n", buf);
+ pr_info("Set isolnodes value to '%s'\n", buf);
return 0;
}
early_param("isolnodes", setup_isolnodes);
@@ -155,7 +156,7 @@ static int __init setup_pci_reserve(char* str)
return -EINVAL;
pci_reserve_mb = mb;
- printk("Reserving %dMB for PCIE root complex mappings\n",
+ pr_info("Reserving %dMB for PCIE root complex mappings\n",
pci_reserve_mb);
return 0;
}
@@ -269,7 +270,7 @@ static void *__init setup_pa_va_mapping(void)
* This is up to 4 mappings for lowmem, one mapping per memory
* controller, plus one for our text segment.
*/
-void __cpuinit store_permanent_mappings(void)
+static void __cpuinit store_permanent_mappings(void)
{
int i;
@@ -320,14 +321,14 @@ static void __init setup_memory(void)
break;
#ifdef CONFIG_FLATMEM
if (i > 0) {
- printk("Can't use discontiguous PAs: %#llx..%#llx\n",
+ pr_err("Can't use discontiguous PAs: %#llx..%#llx\n",
range.size, range.start + range.size);
continue;
}
#endif
#ifndef __tilegx__
if ((unsigned long)range.start) {
- printk("Range not at 4GB multiple: %#llx..%#llx\n",
+ pr_err("Range not at 4GB multiple: %#llx..%#llx\n",
range.start, range.start + range.size);
continue;
}
@@ -335,51 +336,51 @@ static void __init setup_memory(void)
if ((range.start & (HPAGE_SIZE-1)) != 0 ||
(range.size & (HPAGE_SIZE-1)) != 0) {
unsigned long long start_pa = range.start;
- unsigned long long size = range.size;
+ unsigned long long orig_size = range.size;
range.start = (start_pa + HPAGE_SIZE - 1) & HPAGE_MASK;
range.size -= (range.start - start_pa);
range.size &= HPAGE_MASK;
- printk("Range not hugepage-aligned: %#llx..%#llx:"
+ pr_err("Range not hugepage-aligned: %#llx..%#llx:"
" now %#llx-%#llx\n",
- start_pa, start_pa + size,
+ start_pa, start_pa + orig_size,
range.start, range.start + range.size);
}
highbits = __pa_to_highbits(range.start);
if (highbits >= NR_PA_HIGHBIT_VALUES) {
- printk("PA high bits too high: %#llx..%#llx\n",
+ pr_err("PA high bits too high: %#llx..%#llx\n",
range.start, range.start + range.size);
continue;
}
if (highbits_seen[highbits]) {
- printk("Range overlaps in high bits: %#llx..%#llx\n",
+ pr_err("Range overlaps in high bits: %#llx..%#llx\n",
range.start, range.start + range.size);
continue;
}
highbits_seen[highbits] = 1;
if (PFN_DOWN(range.size) > maxnodemem_pfn[i]) {
- int size = maxnodemem_pfn[i];
- if (size > 0) {
- printk("Maxnodemem reduced node %d to"
- " %d pages\n", i, size);
- range.size = (HV_PhysAddr)size << PAGE_SHIFT;
+ int max_size = maxnodemem_pfn[i];
+ if (max_size > 0) {
+ pr_err("Maxnodemem reduced node %d to"
+ " %d pages\n", i, max_size);
+ range.size = PFN_PHYS(max_size);
} else {
- printk("Maxnodemem disabled node %d\n", i);
+ pr_err("Maxnodemem disabled node %d\n", i);
continue;
}
}
if (num_physpages + PFN_DOWN(range.size) > maxmem_pfn) {
- int size = maxmem_pfn - num_physpages;
- if (size > 0) {
- printk("Maxmem reduced node %d to %d pages\n",
- i, size);
- range.size = (HV_PhysAddr)size << PAGE_SHIFT;
+ int max_size = maxmem_pfn - num_physpages;
+ if (max_size > 0) {
+ pr_err("Maxmem reduced node %d to %d pages\n",
+ i, max_size);
+ range.size = PFN_PHYS(max_size);
} else {
- printk("Maxmem disabled node %d\n", i);
+ pr_err("Maxmem disabled node %d\n", i);
continue;
}
}
if (i >= MAX_NUMNODES) {
- printk("Too many PA nodes (#%d): %#llx...%#llx\n",
+ pr_err("Too many PA nodes (#%d): %#llx...%#llx\n",
i, range.size, range.size + range.start);
continue;
}
@@ -391,7 +392,7 @@ static void __init setup_memory(void)
#ifndef __tilegx__
if (((HV_PhysAddr)end << PAGE_SHIFT) !=
(range.start + range.size)) {
- printk("PAs too high to represent: %#llx..%#llx\n",
+ pr_err("PAs too high to represent: %#llx..%#llx\n",
range.start, range.start + range.size);
continue;
}
@@ -412,7 +413,7 @@ static void __init setup_memory(void)
NR_CPUS * (PFN_UP(per_cpu_size) >> PAGE_SHIFT);
if (end < pci_reserve_end_pfn + percpu_pages) {
end = pci_reserve_start_pfn;
- printk("PCI mapping region reduced node %d to"
+ pr_err("PCI mapping region reduced node %d to"
" %ld pages\n", i, end - start);
}
}
@@ -456,11 +457,11 @@ static void __init setup_memory(void)
}
}
num_physpages -= dropped_pages;
- printk(KERN_WARNING "Only using %ldMB memory;"
+ pr_warning("Only using %ldMB memory;"
" ignoring %ldMB.\n",
num_physpages >> (20 - PAGE_SHIFT),
dropped_pages >> (20 - PAGE_SHIFT));
- printk(KERN_WARNING "Consider using a larger page size.\n");
+ pr_warning("Consider using a larger page size.\n");
}
#endif
@@ -478,9 +479,9 @@ static void __init setup_memory(void)
MAXMEM_PFN : mappable_physpages;
highmem_pages = (long) (num_physpages - lowmem_pages);
- printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
+ pr_notice("%ldMB HIGHMEM available.\n",
pages_to_mb(highmem_pages > 0 ? highmem_pages : 0));
- printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
+ pr_notice("%ldMB LOWMEM available.\n",
pages_to_mb(lowmem_pages));
#else
/* Set max_low_pfn based on what node 0 can directly address. */
@@ -488,15 +489,15 @@ static void __init setup_memory(void)
#ifndef __tilegx__
if (node_end_pfn[0] > MAXMEM_PFN) {
- printk(KERN_WARNING "Only using %ldMB LOWMEM.\n",
+ pr_warning("Only using %ldMB LOWMEM.\n",
MAXMEM>>20);
- printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
+ pr_warning("Use a HIGHMEM enabled kernel.\n");
max_low_pfn = MAXMEM_PFN;
max_pfn = MAXMEM_PFN;
num_physpages = MAXMEM_PFN;
node_end_pfn[0] = MAXMEM_PFN;
} else {
- printk(KERN_NOTICE "%ldMB memory available.\n",
+ pr_notice("%ldMB memory available.\n",
pages_to_mb(node_end_pfn[0]));
}
for (i = 1; i < MAX_NUMNODES; ++i) {
@@ -512,7 +513,7 @@ static void __init setup_memory(void)
if (pages)
high_memory = pfn_to_kaddr(node_end_pfn[i]);
}
- printk(KERN_NOTICE "%ldMB memory available.\n",
+ pr_notice("%ldMB memory available.\n",
pages_to_mb(lowmem_pages));
#endif
#endif
@@ -744,7 +745,7 @@ static void __init setup_numa_mapping(void)
nodes_andnot(default_nodes, node_online_map, isolnodes);
if (nodes_empty(default_nodes)) {
BUG_ON(!node_isset(0, node_online_map));
- printk("Forcing NUMA node zero available as a default node\n");
+ pr_err("Forcing NUMA node zero available as a default node\n");
node_set(0, default_nodes);
}
@@ -822,13 +823,13 @@ static void __init setup_numa_mapping(void)
printk(KERN_DEBUG "NUMA cpu-to-node row %d:", y);
for (x = 0; x < smp_width; ++x, ++cpu) {
if (cpu_to_node(cpu) < 0) {
- printk(" -");
+ pr_cont(" -");
cpu_2_node[cpu] = first_node(default_nodes);
} else {
- printk(" %d", cpu_to_node(cpu));
+ pr_cont(" %d", cpu_to_node(cpu));
}
}
- printk("\n");
+ pr_cont("\n");
}
}
@@ -856,12 +857,17 @@ subsys_initcall(topology_init);
#endif /* CONFIG_NUMA */
/**
- * setup_mpls() - Allow the user-space code to access various SPRs.
+ * setup_cpu() - Do all necessary per-cpu, tile-specific initialization.
+ * @boot: Is this the boot cpu?
*
- * Also called from online_secondary().
+ * Called from setup_arch() on the boot cpu, or online_secondary().
*/
-void __cpuinit setup_mpls(void)
+void __cpuinit setup_cpu(int boot)
{
+ /* The boot cpu sets up its permanent mappings much earlier. */
+ if (!boot)
+ store_permanent_mappings();
+
/* Allow asynchronous TLB interrupts. */
#if CHIP_HAS_TILE_DMA()
raw_local_irq_unmask(INT_DMATLB_MISS);
@@ -892,6 +898,14 @@ void __cpuinit setup_mpls(void)
* as well as the PL 0 interrupt mask.
*/
__insn_mtspr(SPR_MPL_INTCTRL_0_SET_0, 1);
+
+ /* Initialize IRQ support for this cpu. */
+ setup_irq_regs();
+
+#ifdef CONFIG_HARDWALL
+ /* Reset the network state on this cpu. */
+ reset_network_state();
+#endif
}
static int __initdata set_initramfs_file;
@@ -922,22 +936,22 @@ static void __init load_hv_initrd(void)
fd = hv_fs_findfile((HV_VirtAddr) initramfs_file);
if (fd == HV_ENOENT) {
if (set_initramfs_file)
- printk("No such hvfs initramfs file '%s'\n",
- initramfs_file);
+ pr_warning("No such hvfs initramfs file '%s'\n",
+ initramfs_file);
return;
}
BUG_ON(fd < 0);
stat = hv_fs_fstat(fd);
BUG_ON(stat.size < 0);
if (stat.flags & HV_FS_ISDIR) {
- printk("Ignoring hvfs file '%s': it's a directory.\n",
- initramfs_file);
+ pr_warning("Ignoring hvfs file '%s': it's a directory.\n",
+ initramfs_file);
return;
}
initrd = alloc_bootmem_pages(stat.size);
rc = hv_fs_pread(fd, (HV_VirtAddr) initrd, stat.size, 0);
if (rc != stat.size) {
- printk("Error reading %d bytes from hvfs file '%s': %d\n",
+ pr_err("Error reading %d bytes from hvfs file '%s': %d\n",
stat.size, initramfs_file, rc);
free_bootmem((unsigned long) initrd, stat.size);
return;
@@ -966,9 +980,9 @@ static void __init validate_hv(void)
HV_Topology topology = hv_inquire_topology();
BUG_ON(topology.coord.x != 0 || topology.coord.y != 0);
if (topology.width != 1 || topology.height != 1) {
- printk("Warning: booting UP kernel on %dx%d grid;"
- " will ignore all but first tile.\n",
- topology.width, topology.height);
+ pr_warning("Warning: booting UP kernel on %dx%d grid;"
+ " will ignore all but first tile.\n",
+ topology.width, topology.height);
}
#endif
@@ -1004,7 +1018,7 @@ static void __init validate_hv(void)
if (hv_confstr(HV_CONFSTR_CHIP_MODEL, (HV_VirtAddr)chip_model,
sizeof(chip_model)) < 0) {
- printk("Warning: HV_CONFSTR_CHIP_MODEL not available\n");
+ pr_err("Warning: HV_CONFSTR_CHIP_MODEL not available\n");
strlcpy(chip_model, "unknown", sizeof(chip_model));
}
}
@@ -1096,7 +1110,7 @@ static int __init disabled_cpus(char *str)
if (str == NULL || cpulist_parse_crop(str, &disabled_map) != 0)
return -EINVAL;
if (cpumask_test_cpu(boot_cpu, &disabled_map)) {
- printk("disabled_cpus: can't disable boot cpu %d\n", boot_cpu);
+ pr_err("disabled_cpus: can't disable boot cpu %d\n", boot_cpu);
cpumask_clear_cpu(boot_cpu, &disabled_map);
}
return 0;
@@ -1104,12 +1118,12 @@ static int __init disabled_cpus(char *str)
early_param("disabled_cpus", disabled_cpus);
-void __init print_disabled_cpus()
+void __init print_disabled_cpus(void)
{
if (!cpumask_empty(&disabled_map)) {
char buf[100];
cpulist_scnprintf(buf, sizeof(buf), &disabled_map);
- printk(KERN_INFO "CPUs not available for Linux: %s\n", buf);
+ pr_info("CPUs not available for Linux: %s\n", buf);
}
}
@@ -1162,7 +1176,7 @@ static void __init setup_cpu_maps(void)
(HV_VirtAddr) cpumask_bits(&cpu_lotar_map),
sizeof(cpu_lotar_map));
if (rc < 0) {
- printk("warning: no HV_INQ_TILES_LOTAR; using AVAIL\n");
+ pr_err("warning: no HV_INQ_TILES_LOTAR; using AVAIL\n");
cpu_lotar_map = cpu_possible_map;
}
@@ -1182,7 +1196,7 @@ static void __init setup_cpu_maps(void)
static int __init dataplane(char *str)
{
- printk("WARNING: dataplane support disabled in this kernel\n");
+ pr_warning("WARNING: dataplane support disabled in this kernel\n");
return 0;
}
@@ -1200,8 +1214,8 @@ void __init setup_arch(char **cmdline_p)
len = hv_get_command_line((HV_VirtAddr) boot_command_line,
COMMAND_LINE_SIZE);
if (boot_command_line[0])
- printk("WARNING: ignoring dynamic command line \"%s\"\n",
- boot_command_line);
+ pr_warning("WARNING: ignoring dynamic command line \"%s\"\n",
+ boot_command_line);
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
#else
char *hv_cmdline;
@@ -1269,7 +1283,7 @@ void __init setup_arch(char **cmdline_p)
setup_numa_mapping();
zone_sizes_init();
set_page_homes();
- setup_mpls();
+ setup_cpu(1);
setup_clock();
load_hv_initrd();
}