Skip to content

Commit

Permalink
Merge branch 'sh/lmb'
Browse files Browse the repository at this point in the history
Conflicts:
	arch/sh/kernel/setup.c
  • Loading branch information
Paul Mundt committed May 13, 2010
2 parents c5eb5b3 + 2182325 commit ef4ed97
Show file tree
Hide file tree
Showing 11 changed files with 271 additions and 209 deletions.
1 change: 1 addition & 0 deletions arch/sh/include/asm/io_generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@ void IO_CONCAT(__IO_PREFIX,iounmap)(void *addr);

void __iomem *IO_CONCAT(__IO_PREFIX,ioport_map)(unsigned long addr, unsigned int size);
void IO_CONCAT(__IO_PREFIX,ioport_unmap)(void __iomem *addr);
void IO_CONCAT(__IO_PREFIX,mem_init)(void);

#undef __IO_PREFIX
8 changes: 8 additions & 0 deletions arch/sh/include/asm/kexec.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
/* The native architecture */
#define KEXEC_ARCH KEXEC_ARCH_SH

#ifdef CONFIG_KEXEC
/* arch/sh/kernel/machine_kexec.c */
void reserve_crashkernel(void);

static inline void crash_setup_regs(struct pt_regs *newregs,
struct pt_regs *oldregs)
{
Expand Down Expand Up @@ -59,4 +63,8 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
newregs->pc = (unsigned long)current_text_addr();
}
}
#else
static inline void reserve_crashkernel(void) { }
#endif /* CONFIG_KEXEC */

#endif /* __ASM_SH_KEXEC_H */
2 changes: 2 additions & 0 deletions arch/sh/include/asm/machvec.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ struct sh_machine_vector {

int (*mv_clk_init)(void);
int (*mv_mode_pins)(void);

void (*mv_mem_init)(void);
};

extern struct sh_machine_vector sh_mv;
Expand Down
3 changes: 2 additions & 1 deletion arch/sh/include/asm/mmzone.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ setup_bootmem_node(int nid, unsigned long start, unsigned long end)
void __init plat_mem_setup(void);

/* arch/sh/kernel/setup.c */
void __init setup_bootmem_allocator(unsigned long start_pfn);
void __init __add_active_range(unsigned int nid, unsigned long start_pfn,
unsigned long end_pfn);
/* arch/sh/mm/init.c */
void __init allocate_pgdat(unsigned int nid);

#endif /* __KERNEL__ */
#endif /* __ASM_SH_MMZONE_H */
2 changes: 1 addition & 1 deletion arch/sh/include/asm/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@

extern unsigned long shm_align_mask;
extern unsigned long max_low_pfn, min_low_pfn;
extern unsigned long memory_start, memory_end;
extern unsigned long memory_start, memory_end, memory_limit;

static inline unsigned long
pages_do_alias(unsigned long addr1, unsigned long addr2)
Expand Down
1 change: 1 addition & 0 deletions arch/sh/include/asm/setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#define COMMAND_LINE ((char *) (PARAM+0x100))

void sh_mv_setup(void);
void check_for_initrd(void);

#endif /* __KERNEL__ */

Expand Down
59 changes: 58 additions & 1 deletion arch/sh/kernel/machine_kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
* This source code is licensed under the GNU General Public License,
* Version 2. See the file COPYING for more details.
*/

#include <linux/mm.h>
#include <linux/kexec.h>
#include <linux/delay.h>
#include <linux/reboot.h>
#include <linux/numa.h>
#include <linux/ftrace.h>
#include <linux/suspend.h>
#include <linux/lmb.h>
#include <asm/pgtable.h>
#include <asm/pgalloc.h>
#include <asm/mmu_context.h>
Expand Down Expand Up @@ -151,3 +151,60 @@ void arch_crash_save_vmcoreinfo(void)
VMCOREINFO_CONFIG(X2TLB);
#endif
}

void __init reserve_crashkernel(void)
{
unsigned long long crash_size, crash_base;
int ret;

/* this is necessary because of lmb_phys_mem_size() */
lmb_analyze();

ret = parse_crashkernel(boot_command_line, lmb_phys_mem_size(),
&crash_size, &crash_base);
if (ret == 0 && crash_size > 0) {
crashk_res.start = crash_base;
crashk_res.end = crash_base + crash_size - 1;
}

if (crashk_res.end == crashk_res.start)
goto disable;

crash_size = PAGE_ALIGN(crashk_res.end - crashk_res.start + 1);
if (!crashk_res.start) {
unsigned long max = lmb_end_of_DRAM() - memory_limit;
crashk_res.start = __lmb_alloc_base(crash_size, PAGE_SIZE, max);
if (!crashk_res.start) {
pr_err("crashkernel allocation failed\n");
goto disable;
}
} else {
ret = lmb_reserve(crashk_res.start, crash_size);
if (unlikely(ret < 0)) {
pr_err("crashkernel reservation failed - "
"memory is in use\n");
goto disable;
}
}

crashk_res.end = crashk_res.start + crash_size - 1;

/*
* Crash kernel trumps memory limit
*/
if ((lmb_end_of_DRAM() - memory_limit) <= crashk_res.end) {
memory_limit = 0;
pr_info("Disabled memory limit for crashkernel\n");
}

pr_info("Reserving %ldMB of memory at 0x%08lx "
"for crashkernel (System RAM: %ldMB)\n",
(unsigned long)(crash_size >> 20),
(unsigned long)(crashk_res.start),
(unsigned long)(lmb_phys_mem_size() >> 20));

return;

disable:
crashk_res.start = crashk_res.end = 0;
}
1 change: 1 addition & 0 deletions arch/sh/kernel/machvec.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ void __init sh_mv_setup(void)
mv_set(ioport_unmap);
mv_set(irq_demux);
mv_set(mode_pins);
mv_set(mem_init);

if (!sh_mv.mv_nr_irqs)
sh_mv.mv_nr_irqs = NR_IRQS;
Expand Down
Loading

0 comments on commit ef4ed97

Please sign in to comment.