forked from Minki/linux
368dd5acd1
Implement the Panasonic MN10300 AM34 CPU subarch and implement SMP support for MN10300. Also implement support for the MN2WS0060 processor and the ASB2364 evaluation board which are AM34 based. Signed-off-by: Akira Takeuchi <takeuchi.akr@jp.panasonic.com> Signed-off-by: Kiyoshi Owada <owada.kiyoshi@jp.panasonic.com> Signed-off-by: David Howells <dhowells@redhat.com>
152 lines
3.1 KiB
ArmAsm
152 lines
3.1 KiB
ArmAsm
/* Boot entry point for a compressed MN10300 kernel
|
|
*
|
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public Licence
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the Licence, or (at your option) any later version.
|
|
*/
|
|
.section .text
|
|
|
|
#define DEBUG
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/cpu-regs.h>
|
|
#include <asm/cache.h>
|
|
#ifdef CONFIG_SMP
|
|
#include <proc/smp-regs.h>
|
|
#endif
|
|
|
|
.globl startup_32
|
|
startup_32:
|
|
#ifdef CONFIG_SMP
|
|
#
|
|
# Secondary CPUs jump directly to the kernel entry point
|
|
#
|
|
# Must save primary CPU's D0-D2 registers as they hold boot parameters
|
|
#
|
|
mov (CPUID), d3
|
|
and CPUID_MASK,d3
|
|
beq startup_primary
|
|
mov CONFIG_KERNEL_TEXT_ADDRESS,a0
|
|
jmp (a0)
|
|
|
|
startup_primary:
|
|
#endif /* CONFIG_SMP */
|
|
|
|
# first save parameters from bootloader
|
|
mov param_save_area,a0
|
|
mov d0,(a0)
|
|
mov d1,(4,a0)
|
|
mov d2,(8,a0)
|
|
|
|
mov sp,a3
|
|
mov decomp_stack+0x2000-4,a0
|
|
mov a0,sp
|
|
|
|
# invalidate and enable both of the caches
|
|
mov CHCTR,a0
|
|
clr d0
|
|
movhu d0,(a0) # turn off first
|
|
mov CHCTR_ICINV|CHCTR_DCINV,d0
|
|
movhu d0,(a0)
|
|
setlb
|
|
mov (a0),d0
|
|
btst CHCTR_ICBUSY|CHCTR_DCBUSY,d0 # wait till not busy
|
|
lne
|
|
|
|
#ifdef CONFIG_MN10300_CACHE_ENABLED
|
|
#ifdef CONFIG_MN10300_CACHE_WBACK
|
|
mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD_WRBACK,d0
|
|
#else
|
|
mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD_WRTHROUGH,d0
|
|
#endif /* WBACK */
|
|
movhu d0,(a0) # enable
|
|
#endif /* !ENABLED */
|
|
|
|
# clear the BSS area
|
|
mov __bss_start,a0
|
|
mov _end,a1
|
|
clr d0
|
|
bssclear:
|
|
cmp a1,a0
|
|
bge bssclear_end
|
|
movbu d0,(a0)
|
|
inc a0
|
|
bra bssclear
|
|
bssclear_end:
|
|
|
|
# decompress the kernel
|
|
call decompress_kernel[],0
|
|
#ifdef CONFIG_MN10300_CACHE_WBACK
|
|
call mn10300_dcache_flush_inv[],0
|
|
#endif
|
|
|
|
# disable caches again
|
|
mov CHCTR,a0
|
|
clr d0
|
|
movhu d0,(a0)
|
|
setlb
|
|
mov (a0),d0
|
|
btst CHCTR_ICBUSY|CHCTR_DCBUSY,d0 # wait till not busy
|
|
lne
|
|
|
|
mov param_save_area,a0
|
|
mov (a0),d0
|
|
mov (4,a0),d1
|
|
mov (8,a0),d2
|
|
|
|
# jump to the kernel proper entry point
|
|
mov a3,sp
|
|
mov CONFIG_KERNEL_TEXT_ADDRESS,a0
|
|
jmp (a0)
|
|
|
|
|
|
###############################################################################
|
|
#
|
|
# Cache flush routines
|
|
#
|
|
###############################################################################
|
|
#ifdef CONFIG_MN10300_CACHE_WBACK
|
|
mn10300_dcache_flush_inv:
|
|
movhu (CHCTR),d0
|
|
btst CHCTR_DCEN,d0
|
|
beq mn10300_dcache_flush_inv_end
|
|
|
|
mov L1_CACHE_NENTRIES,d1
|
|
clr a1
|
|
|
|
mn10300_dcache_flush_inv_loop:
|
|
mov (DCACHE_PURGE_WAY0(0),a1),d0 # unconditional purge
|
|
mov (DCACHE_PURGE_WAY1(0),a1),d0 # unconditional purge
|
|
mov (DCACHE_PURGE_WAY2(0),a1),d0 # unconditional purge
|
|
mov (DCACHE_PURGE_WAY3(0),a1),d0 # unconditional purge
|
|
|
|
add L1_CACHE_BYTES,a1
|
|
add -1,d1
|
|
bne mn10300_dcache_flush_inv_loop
|
|
|
|
mn10300_dcache_flush_inv_end:
|
|
ret [],0
|
|
#endif /* CONFIG_MN10300_CACHE_WBACK */
|
|
|
|
|
|
###############################################################################
|
|
#
|
|
# Data areas
|
|
#
|
|
###############################################################################
|
|
.data
|
|
.align 4
|
|
param_save_area:
|
|
.rept 3
|
|
.word 0
|
|
.endr
|
|
|
|
.section .bss
|
|
.align 4
|
|
decomp_stack:
|
|
.space 0x2000
|