diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/mips-cpc.c | 13 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 16 | ||||
| -rw-r--r-- | arch/mips/kernel/smp-bmips.c | 10 | 
3 files changed, 30 insertions, 9 deletions
diff --git a/arch/mips/kernel/mips-cpc.c b/arch/mips/kernel/mips-cpc.c index 19c88d770054..fcf9af492d60 100644 --- a/arch/mips/kernel/mips-cpc.c +++ b/arch/mips/kernel/mips-cpc.c @@ -10,6 +10,8 @@  #include <linux/errno.h>  #include <linux/percpu.h> +#include <linux/of.h> +#include <linux/of_address.h>  #include <linux/spinlock.h>  #include <asm/mips-cps.h> @@ -22,6 +24,17 @@ static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags);  phys_addr_t __weak mips_cpc_default_phys_base(void)  { +	struct device_node *cpc_node; +	struct resource res; +	int err; + +	cpc_node = of_find_compatible_node(of_root, NULL, "mti,mips-cpc"); +	if (cpc_node) { +		err = of_address_to_resource(cpc_node, 0, &res); +		if (!err) +			return res.start; +	} +  	return 0;  } diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 85bc601e9a0d..5f8b0a9e30b3 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -375,6 +375,7 @@ static void __init bootmem_init(void)  	unsigned long reserved_end;  	unsigned long mapstart = ~0UL;  	unsigned long bootmap_size; +	phys_addr_t ramstart = (phys_addr_t)ULLONG_MAX;  	bool bootmap_valid = false;  	int i; @@ -395,7 +396,8 @@ static void __init bootmem_init(void)  	max_low_pfn = 0;  	/* -	 * Find the highest page frame number we have available. +	 * Find the highest page frame number we have available +	 * and the lowest used RAM address  	 */  	for (i = 0; i < boot_mem_map.nr_map; i++) {  		unsigned long start, end; @@ -407,6 +409,8 @@ static void __init bootmem_init(void)  		end = PFN_DOWN(boot_mem_map.map[i].addr  				+ boot_mem_map.map[i].size); +		ramstart = min(ramstart, boot_mem_map.map[i].addr); +  #ifndef CONFIG_HIGHMEM  		/*  		 * Skip highmem here so we get an accurate max_low_pfn if low @@ -436,6 +440,13 @@ static void __init bootmem_init(void)  		mapstart = max(reserved_end, start);  	} +	/* +	 * Reserve any memory between the start of RAM and PHYS_OFFSET +	 */ +	if (ramstart > PHYS_OFFSET) +		add_memory_region(PHYS_OFFSET, ramstart - PHYS_OFFSET, +				  BOOT_MEM_RESERVED); +  	if (min_low_pfn >= max_low_pfn)  		panic("Incorrect memory mapping !!!");  	if (min_low_pfn > ARCH_PFN_OFFSET) { @@ -664,9 +675,6 @@ static int __init early_parse_mem(char *p)  	add_memory_region(start, size, BOOT_MEM_RAM); -	if (start && start > PHYS_OFFSET) -		add_memory_region(PHYS_OFFSET, start - PHYS_OFFSET, -				BOOT_MEM_RESERVED);  	return 0;  }  early_param("mem", early_parse_mem); diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c index 87dcac2447c8..159e83add4bb 100644 --- a/arch/mips/kernel/smp-bmips.c +++ b/arch/mips/kernel/smp-bmips.c @@ -168,11 +168,11 @@ static void bmips_prepare_cpus(unsigned int max_cpus)  		return;  	} -	if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, -			"smp_ipi0", NULL)) +	if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, +			IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi0", NULL))  		panic("Can't request IPI0 interrupt"); -	if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, -			"smp_ipi1", NULL)) +	if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, +			IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi1", NULL))  		panic("Can't request IPI1 interrupt");  } @@ -572,7 +572,7 @@ asmlinkage void __weak plat_wired_tlb_setup(void)  	 */  } -void __init bmips_cpu_setup(void) +void bmips_cpu_setup(void)  {  	void __iomem __maybe_unused *cbr = BMIPS_GET_CBR();  	u32 __maybe_unused cfg;  | 

