Merge branch 'mips-next-3.9' of git://git.linux-mips.org/pub/scm/john/linux-john into mips-for-linux-next
This commit is contained in:
@@ -27,6 +27,7 @@ obj-$(CONFIG_CSRC_IOASIC) += csrc-ioasic.o
|
||||
obj-$(CONFIG_CSRC_POWERTV) += csrc-powertv.o
|
||||
obj-$(CONFIG_CSRC_R4K) += csrc-r4k.o
|
||||
obj-$(CONFIG_CSRC_SB1250) += csrc-sb1250.o
|
||||
obj-$(CONFIG_CSRC_GIC) += csrc-gic.o
|
||||
obj-$(CONFIG_SYNC_R4K) += sync-r4k.o
|
||||
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
@@ -98,4 +99,35 @@ obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_mipsxx.o
|
||||
|
||||
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
|
||||
|
||||
#
|
||||
# DSP ASE supported for MIPS32 or MIPS64 Release 2 cores only. It is safe
|
||||
# to enable DSP assembler support here even if the MIPS Release 2 CPU we
|
||||
# are targetting does not support DSP because all code-paths making use of
|
||||
# it properly check that the running CPU *actually does* support these
|
||||
# instructions.
|
||||
#
|
||||
ifeq ($(CONFIG_CPU_MIPSR2), y)
|
||||
CFLAGS_DSP = -DHAVE_AS_DSP
|
||||
|
||||
#
|
||||
# Check if assembler supports DSP ASE
|
||||
#
|
||||
ifeq ($(call cc-option-yn,-mdsp), y)
|
||||
CFLAGS_DSP += -mdsp
|
||||
endif
|
||||
|
||||
#
|
||||
# Check if assembler supports DSP ASE Rev2
|
||||
#
|
||||
ifeq ($(call cc-option-yn,-mdspr2), y)
|
||||
CFLAGS_DSP += -mdspr2
|
||||
endif
|
||||
|
||||
CFLAGS_signal.o = $(CFLAGS_DSP)
|
||||
CFLAGS_signal32.o = $(CFLAGS_DSP)
|
||||
CFLAGS_process.o = $(CFLAGS_DSP)
|
||||
CFLAGS_branch.o = $(CFLAGS_DSP)
|
||||
CFLAGS_ptrace.o = $(CFLAGS_DSP)
|
||||
endif
|
||||
|
||||
CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS)
|
||||
|
||||
@@ -201,6 +201,7 @@ void __init check_wait(void)
|
||||
break;
|
||||
|
||||
case CPU_M14KC:
|
||||
case CPU_M14KEC:
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
case CPU_1004K:
|
||||
@@ -467,6 +468,10 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)
|
||||
c->ases |= MIPS_ASE_MIPSMT;
|
||||
if (config3 & MIPS_CONF3_ULRI)
|
||||
c->options |= MIPS_CPU_ULRI;
|
||||
if (config3 & MIPS_CONF3_ISA)
|
||||
c->options |= MIPS_CPU_MICROMIPS;
|
||||
if (config3 & MIPS_CONF3_VZ)
|
||||
c->ases |= MIPS_ASE_VZ;
|
||||
|
||||
return config3 & MIPS_CONF_M;
|
||||
}
|
||||
@@ -866,10 +871,13 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
__cpu_name[cpu] = "MIPS 20Kc";
|
||||
break;
|
||||
case PRID_IMP_24K:
|
||||
case PRID_IMP_24KE:
|
||||
c->cputype = CPU_24K;
|
||||
__cpu_name[cpu] = "MIPS 24Kc";
|
||||
break;
|
||||
case PRID_IMP_24KE:
|
||||
c->cputype = CPU_24K;
|
||||
__cpu_name[cpu] = "MIPS 24KEc";
|
||||
break;
|
||||
case PRID_IMP_25KF:
|
||||
c->cputype = CPU_25KF;
|
||||
__cpu_name[cpu] = "MIPS 25Kc";
|
||||
@@ -886,6 +894,10 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
c->cputype = CPU_M14KC;
|
||||
__cpu_name[cpu] = "MIPS M14Kc";
|
||||
break;
|
||||
case PRID_IMP_M14KEC:
|
||||
c->cputype = CPU_M14KEC;
|
||||
__cpu_name[cpu] = "MIPS M14KEc";
|
||||
break;
|
||||
case PRID_IMP_1004K:
|
||||
c->cputype = CPU_1004K;
|
||||
__cpu_name[cpu] = "MIPS 1004Kc";
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
||||
*/
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/gic.h>
|
||||
|
||||
static cycle_t gic_hpt_read(struct clocksource *cs)
|
||||
{
|
||||
unsigned int hi, hi2, lo;
|
||||
|
||||
do {
|
||||
GICREAD(GIC_REG(SHARED, GIC_SH_COUNTER_63_32), hi);
|
||||
GICREAD(GIC_REG(SHARED, GIC_SH_COUNTER_31_00), lo);
|
||||
GICREAD(GIC_REG(SHARED, GIC_SH_COUNTER_63_32), hi2);
|
||||
} while (hi2 != hi);
|
||||
|
||||
return (((cycle_t) hi) << 32) + lo;
|
||||
}
|
||||
|
||||
static struct clocksource gic_clocksource = {
|
||||
.name = "GIC",
|
||||
.read = gic_hpt_read,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
void __init gic_clocksource_init(unsigned int frequency)
|
||||
{
|
||||
unsigned int config, bits;
|
||||
|
||||
/* Calculate the clocksource mask. */
|
||||
GICREAD(GIC_REG(SHARED, GIC_SH_CONFIG), config);
|
||||
bits = 32 + ((config & GIC_SH_CONFIG_COUNTBITS_MSK) >>
|
||||
(GIC_SH_CONFIG_COUNTBITS_SHF - 2));
|
||||
|
||||
/* Set clocksource mask. */
|
||||
gic_clocksource.mask = CLOCKSOURCE_MASK(bits);
|
||||
|
||||
/* Calculate a somewhat reasonable rating value. */
|
||||
gic_clocksource.rating = 200 + frequency / 10000000;
|
||||
|
||||
clocksource_register_hz(&gic_clocksource, frequency);
|
||||
}
|
||||
@@ -14,8 +14,7 @@
|
||||
|
||||
extern void prom_putchar(char);
|
||||
|
||||
static void __init
|
||||
early_console_write(struct console *con, const char *s, unsigned n)
|
||||
static void early_console_write(struct console *con, const char *s, unsigned n)
|
||||
{
|
||||
while (n-- && *s) {
|
||||
if (*s == '\n')
|
||||
@@ -25,7 +24,7 @@ early_console_write(struct console *con, const char *s, unsigned n)
|
||||
}
|
||||
}
|
||||
|
||||
static struct console early_console __initdata = {
|
||||
static struct console early_console = {
|
||||
.name = "early",
|
||||
.write = early_console_write,
|
||||
.flags = CON_PRINTBUFFER | CON_BOOT,
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqdomain.h>
|
||||
|
||||
#include <asm/irq_cpu.h>
|
||||
#include <asm/mipsregs.h>
|
||||
@@ -113,3 +114,44 @@ void __init mips_cpu_irq_init(void)
|
||||
irq_set_chip_and_handler(i, &mips_cpu_irq_controller,
|
||||
handle_percpu_irq);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IRQ_DOMAIN
|
||||
static int mips_cpu_intc_map(struct irq_domain *d, unsigned int irq,
|
||||
irq_hw_number_t hw)
|
||||
{
|
||||
static struct irq_chip *chip;
|
||||
|
||||
if (hw < 2 && cpu_has_mipsmt) {
|
||||
/* Software interrupts are used for MT/CMT IPI */
|
||||
chip = &mips_mt_cpu_irq_controller;
|
||||
} else {
|
||||
chip = &mips_cpu_irq_controller;
|
||||
}
|
||||
|
||||
irq_set_chip_and_handler(irq, chip, handle_percpu_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct irq_domain_ops mips_cpu_intc_irq_domain_ops = {
|
||||
.map = mips_cpu_intc_map,
|
||||
.xlate = irq_domain_xlate_onecell,
|
||||
};
|
||||
|
||||
int __init mips_cpu_intc_init(struct device_node *of_node,
|
||||
struct device_node *parent)
|
||||
{
|
||||
struct irq_domain *domain;
|
||||
|
||||
/* Mask interrupts. */
|
||||
clear_c0_status(ST0_IM);
|
||||
clear_c0_cause(CAUSEF_IP);
|
||||
|
||||
domain = irq_domain_add_legacy(of_node, 8, MIPS_CPU_IRQ_BASE, 0,
|
||||
&mips_cpu_intc_irq_domain_ops, NULL);
|
||||
if (!domain)
|
||||
panic("Failed to add irqdomain for MIPS CPU\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_IRQ_DOMAIN */
|
||||
|
||||
@@ -95,6 +95,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
if (cpu_has_dsp) seq_printf(m, "%s", " dsp");
|
||||
if (cpu_has_dsp2) seq_printf(m, "%s", " dsp2");
|
||||
if (cpu_has_mipsmt) seq_printf(m, "%s", " mt");
|
||||
if (cpu_has_mmips) seq_printf(m, "%s", " micromips");
|
||||
if (cpu_has_vz) seq_printf(m, "%s", " vz");
|
||||
seq_printf(m, "\n");
|
||||
|
||||
seq_printf(m, "shadow register sets\t: %d\n",
|
||||
|
||||
+70
-21
@@ -480,34 +480,75 @@ static int __init early_parse_mem(char *p)
|
||||
}
|
||||
early_param("mem", early_parse_mem);
|
||||
|
||||
#ifdef CONFIG_PROC_VMCORE
|
||||
unsigned long setup_elfcorehdr, setup_elfcorehdr_size;
|
||||
static int __init early_parse_elfcorehdr(char *p)
|
||||
{
|
||||
int i;
|
||||
|
||||
setup_elfcorehdr = memparse(p, &p);
|
||||
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
unsigned long start = boot_mem_map.map[i].addr;
|
||||
unsigned long end = (boot_mem_map.map[i].addr +
|
||||
boot_mem_map.map[i].size);
|
||||
if (setup_elfcorehdr >= start && setup_elfcorehdr < end) {
|
||||
/*
|
||||
* Reserve from the elf core header to the end of
|
||||
* the memory segment, that should all be kdump
|
||||
* reserved memory.
|
||||
*/
|
||||
setup_elfcorehdr_size = end - setup_elfcorehdr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If we don't find it in the memory map, then we shouldn't
|
||||
* have to worry about it, as the new kernel won't use it.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
early_param("elfcorehdr", early_parse_elfcorehdr);
|
||||
#endif
|
||||
|
||||
static void __init arch_mem_addpart(phys_t mem, phys_t end, int type)
|
||||
{
|
||||
phys_t size;
|
||||
int i;
|
||||
|
||||
size = end - mem;
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
/* Make sure it is in the boot_mem_map */
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
if (mem >= boot_mem_map.map[i].addr &&
|
||||
mem < (boot_mem_map.map[i].addr +
|
||||
boot_mem_map.map[i].size))
|
||||
return;
|
||||
}
|
||||
add_memory_region(mem, size, type);
|
||||
}
|
||||
|
||||
static void __init arch_mem_init(char **cmdline_p)
|
||||
{
|
||||
phys_t init_mem, init_end, init_size;
|
||||
|
||||
extern void plat_mem_setup(void);
|
||||
|
||||
/* call board setup routine */
|
||||
plat_mem_setup();
|
||||
|
||||
init_mem = PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT;
|
||||
init_end = PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT;
|
||||
init_size = init_end - init_mem;
|
||||
if (init_size) {
|
||||
/* Make sure it is in the boot_mem_map */
|
||||
int i, found;
|
||||
found = 0;
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
if (init_mem >= boot_mem_map.map[i].addr &&
|
||||
init_mem < (boot_mem_map.map[i].addr +
|
||||
boot_mem_map.map[i].size)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
add_memory_region(init_mem, init_size,
|
||||
BOOT_MEM_INIT_RAM);
|
||||
}
|
||||
/*
|
||||
* Make sure all kernel memory is in the maps. The "UP" and
|
||||
* "DOWN" are opposite for initdata since if it crosses over
|
||||
* into another memory section you don't want that to be
|
||||
* freed when the initdata is freed.
|
||||
*/
|
||||
arch_mem_addpart(PFN_DOWN(__pa_symbol(&_text)) << PAGE_SHIFT,
|
||||
PFN_UP(__pa_symbol(&_edata)) << PAGE_SHIFT,
|
||||
BOOT_MEM_RAM);
|
||||
arch_mem_addpart(PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT,
|
||||
PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT,
|
||||
BOOT_MEM_INIT_RAM);
|
||||
|
||||
pr_info("Determined physical RAM map:\n");
|
||||
print_memory_map();
|
||||
@@ -537,6 +578,14 @@ static void __init arch_mem_init(char **cmdline_p)
|
||||
}
|
||||
|
||||
bootmem_init();
|
||||
#ifdef CONFIG_PROC_VMCORE
|
||||
if (setup_elfcorehdr && setup_elfcorehdr_size) {
|
||||
printk(KERN_INFO "kdump reserved memory at %lx-%lx\n",
|
||||
setup_elfcorehdr, setup_elfcorehdr_size);
|
||||
reserve_bootmem(setup_elfcorehdr, setup_elfcorehdr_size,
|
||||
BOOTMEM_DEFAULT);
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
if (crashk_res.start != crashk_res.end)
|
||||
reserve_bootmem(crashk_res.start,
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/smtc.h>
|
||||
#include <asm/smtc_proc.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
/*
|
||||
* SMTC Kernel needs to manipulate low-level CPU interrupt mask
|
||||
|
||||
+3
-12
@@ -697,18 +697,7 @@ static int vpe_run(struct vpe * v)
|
||||
dmt_flag = dmt();
|
||||
vpeflags = dvpe();
|
||||
|
||||
if (!list_empty(&v->tc)) {
|
||||
if ((t = list_entry(v->tc.next, struct tc, tc)) == NULL) {
|
||||
evpe(vpeflags);
|
||||
emt(dmt_flag);
|
||||
local_irq_restore(flags);
|
||||
|
||||
printk(KERN_WARNING
|
||||
"VPE loader: TC %d is already in use.\n",
|
||||
v->tc->index);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
} else {
|
||||
if (list_empty(&v->tc)) {
|
||||
evpe(vpeflags);
|
||||
emt(dmt_flag);
|
||||
local_irq_restore(flags);
|
||||
@@ -720,6 +709,8 @@ static int vpe_run(struct vpe * v)
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
t = list_first_entry(&v->tc, struct tc, tc);
|
||||
|
||||
/* Put MVPE's into 'configuration state' */
|
||||
set_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user