diff options
-rw-r--r-- | arch/sh/Kconfig | 11 | ||||
-rw-r--r-- | arch/sh/boot/romimage/Makefile | 13 | ||||
-rw-r--r-- | arch/sh/boot/romimage/head.S | 30 | ||||
-rw-r--r-- | arch/sh/boot/romimage/mmcif-sh7724.c | 72 | ||||
-rw-r--r-- | arch/sh/boot/romimage/vmlinux.scr | 1 | ||||
-rw-r--r-- | arch/sh/include/cpu-sh4/cpu/sh7724.h | 1 | ||||
-rw-r--r-- | arch/sh/include/mach-common/mach/romimage.h | 10 | ||||
-rw-r--r-- | arch/sh/include/mach-ecovec24/mach/romimage.h | 27 | ||||
-rw-r--r-- | arch/sh/include/mach-kfr2r09/mach/romimage.h | 10 |
9 files changed, 171 insertions, 4 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index c5ee4ce60b57..22d25113d76a 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -776,6 +776,17 @@ config ENTRY_OFFSET | |||
776 | default "0x00010000" if PAGE_SIZE_64KB | 776 | default "0x00010000" if PAGE_SIZE_64KB |
777 | default "0x00000000" | 777 | default "0x00000000" |
778 | 778 | ||
779 | config ROMIMAGE_MMCIF | ||
780 | bool "Include MMCIF loader in romImage (EXPERIMENTAL)" | ||
781 | depends on CPU_SUBTYPE_SH7724 && EXPERIMENTAL | ||
782 | help | ||
783 | Say Y here to include experimental MMCIF loading code in | ||
784 | romImage. With this enabled it is possible to write the romImage | ||
785 | kernel image to an MMC card and boot the kernel straight from | ||
786 | the reset vector. At reset the processor Mask ROM will load the | ||
787 | first part of the romImage which in turn loads the rest the kernel | ||
788 | image to RAM using the MMCIF hardware block. | ||
789 | |||
779 | choice | 790 | choice |
780 | prompt "Kernel command line" | 791 | prompt "Kernel command line" |
781 | optional | 792 | optional |
diff --git a/arch/sh/boot/romimage/Makefile b/arch/sh/boot/romimage/Makefile index f473a24a2d92..2216ee57f251 100644 --- a/arch/sh/boot/romimage/Makefile +++ b/arch/sh/boot/romimage/Makefile | |||
@@ -1,16 +1,21 @@ | |||
1 | # | 1 | # |
2 | # linux/arch/sh/boot/romimage/Makefile | 2 | # linux/arch/sh/boot/romimage/Makefile |
3 | # | 3 | # |
4 | # create an image suitable for burning to flash from zImage | 4 | # create an romImage file suitable for burning to flash/mmc from zImage |
5 | # | 5 | # |
6 | 6 | ||
7 | targets := vmlinux head.o zeropage.bin piggy.o | 7 | targets := vmlinux head.o zeropage.bin piggy.o |
8 | load-y := 0 | ||
8 | 9 | ||
9 | OBJECTS = $(obj)/head.o | 10 | mmcif-load-$(CONFIG_CPU_SUBTYPE_SH7724) := 0xe5200000 # ILRAM |
10 | LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext 0 -e romstart \ | 11 | mmcif-obj-$(CONFIG_CPU_SUBTYPE_SH7724) := $(obj)/mmcif-sh7724.o |
12 | load-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-load-y) | ||
13 | obj-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-obj-y) | ||
14 | |||
15 | LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(load-y) -e romstart \ | ||
11 | -T $(obj)/../../kernel/vmlinux.lds | 16 | -T $(obj)/../../kernel/vmlinux.lds |
12 | 17 | ||
13 | $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE | 18 | $(obj)/vmlinux: $(obj)/head.o $(obj-y) $(obj)/piggy.o FORCE |
14 | $(call if_changed,ld) | 19 | $(call if_changed,ld) |
15 | @: | 20 | @: |
16 | 21 | ||
diff --git a/arch/sh/boot/romimage/head.S b/arch/sh/boot/romimage/head.S index 65b8256d81cb..4671d1b82150 100644 --- a/arch/sh/boot/romimage/head.S +++ b/arch/sh/boot/romimage/head.S | |||
@@ -12,6 +12,36 @@ romstart: | |||
12 | /* include board specific setup code */ | 12 | /* include board specific setup code */ |
13 | #include <mach/romimage.h> | 13 | #include <mach/romimage.h> |
14 | 14 | ||
15 | #ifdef CONFIG_ROMIMAGE_MMCIF | ||
16 | /* load the romImage to above the empty zero page */ | ||
17 | mov.l empty_zero_page_dst, r4 | ||
18 | mov.l empty_zero_page_dst_adj, r5 | ||
19 | add r5, r4 | ||
20 | mov.l bytes_to_load, r5 | ||
21 | mov.l loader_function, r7 | ||
22 | jsr @r7 | ||
23 | mov r4, r15 | ||
24 | |||
25 | mov.l empty_zero_page_dst, r4 | ||
26 | mov.l empty_zero_page_dst_adj, r5 | ||
27 | add r5, r4 | ||
28 | mov.l loaded_code_offs, r5 | ||
29 | add r5, r4 | ||
30 | jmp @r4 | ||
31 | nop | ||
32 | |||
33 | .balign 4 | ||
34 | empty_zero_page_dst_adj: | ||
35 | .long PAGE_SIZE | ||
36 | bytes_to_load: | ||
37 | .long end_data - romstart | ||
38 | loader_function: | ||
39 | .long mmcif_loader | ||
40 | loaded_code_offs: | ||
41 | .long loaded_code - romstart | ||
42 | loaded_code: | ||
43 | #endif /* CONFIG_ROMIMAGE_MMCIF */ | ||
44 | |||
15 | /* copy the empty_zero_page contents to where vmlinux expects it */ | 45 | /* copy the empty_zero_page contents to where vmlinux expects it */ |
16 | mova extra_data_pos, r0 | 46 | mova extra_data_pos, r0 |
17 | mov.l extra_data_size, r1 | 47 | mov.l extra_data_size, r1 |
diff --git a/arch/sh/boot/romimage/mmcif-sh7724.c b/arch/sh/boot/romimage/mmcif-sh7724.c new file mode 100644 index 000000000000..14863d7292cb --- /dev/null +++ b/arch/sh/boot/romimage/mmcif-sh7724.c | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * sh7724 MMCIF loader | ||
3 | * | ||
4 | * Copyright (C) 2010 Magnus Damm | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/mmc/sh_mmcif.h> | ||
12 | #include <mach/romimage.h> | ||
13 | |||
14 | #define MMCIF_BASE (void __iomem *)0xa4ca0000 | ||
15 | |||
16 | #define MSTPCR2 0xa4150038 | ||
17 | #define PTWCR 0xa4050146 | ||
18 | #define PTXCR 0xa4050148 | ||
19 | #define PSELA 0xa405014e | ||
20 | #define PSELE 0xa4050156 | ||
21 | #define HIZCRC 0xa405015c | ||
22 | #define DRVCRA 0xa405018a | ||
23 | |||
24 | enum { MMCIF_PROGRESS_ENTER, MMCIF_PROGRESS_INIT, | ||
25 | MMCIF_PROGRESS_LOAD, MMCIF_PROGRESS_DONE }; | ||
26 | |||
27 | /* SH7724 specific MMCIF loader | ||
28 | * | ||
29 | * loads the romImage from an MMC card starting from block 512 | ||
30 | * use the following line to write the romImage to an MMC card | ||
31 | * # dd if=arch/sh/boot/romImage of=/dev/sdx bs=512 seek=512 | ||
32 | */ | ||
33 | asmlinkage void mmcif_loader(unsigned char *buf, unsigned long no_bytes) | ||
34 | { | ||
35 | mmcif_update_progress(MMCIF_PROGRESS_ENTER); | ||
36 | |||
37 | /* enable clock to the MMCIF hardware block */ | ||
38 | __raw_writel(__raw_readl(MSTPCR2) & ~0x20000000, MSTPCR2); | ||
39 | |||
40 | /* setup pins D7-D0 */ | ||
41 | __raw_writew(0x0000, PTWCR); | ||
42 | |||
43 | /* setup pins MMC_CLK, MMC_CMD */ | ||
44 | __raw_writew(__raw_readw(PTXCR) & ~0x000f, PTXCR); | ||
45 | |||
46 | /* select D3-D0 pin function */ | ||
47 | __raw_writew(__raw_readw(PSELA) & ~0x2000, PSELA); | ||
48 | |||
49 | /* select D7-D4 pin function */ | ||
50 | __raw_writew(__raw_readw(PSELE) & ~0x3000, PSELE); | ||
51 | |||
52 | /* disable Hi-Z for the MMC pins */ | ||
53 | __raw_writew(__raw_readw(HIZCRC) & ~0x0620, HIZCRC); | ||
54 | |||
55 | /* high drive capability for MMC pins */ | ||
56 | __raw_writew(__raw_readw(DRVCRA) | 0x3000, DRVCRA); | ||
57 | |||
58 | mmcif_update_progress(MMCIF_PROGRESS_INIT); | ||
59 | |||
60 | /* setup MMCIF hardware */ | ||
61 | sh_mmcif_boot_init(MMCIF_BASE); | ||
62 | |||
63 | mmcif_update_progress(MMCIF_PROGRESS_LOAD); | ||
64 | |||
65 | /* load kernel via MMCIF interface */ | ||
66 | sh_mmcif_boot_slurp(MMCIF_BASE, buf, no_bytes); | ||
67 | |||
68 | /* disable clock to the MMCIF hardware block */ | ||
69 | __raw_writel(__raw_readl(MSTPCR2) | 0x20000000, MSTPCR2); | ||
70 | |||
71 | mmcif_update_progress(MMCIF_PROGRESS_DONE); | ||
72 | } | ||
diff --git a/arch/sh/boot/romimage/vmlinux.scr b/arch/sh/boot/romimage/vmlinux.scr index ea27298a99a7..590394e2f5f2 100644 --- a/arch/sh/boot/romimage/vmlinux.scr +++ b/arch/sh/boot/romimage/vmlinux.scr | |||
@@ -3,5 +3,6 @@ SECTIONS | |||
3 | .text : { | 3 | .text : { |
4 | zero_page_pos = .; | 4 | zero_page_pos = .; |
5 | *(.data) | 5 | *(.data) |
6 | end_data = .; | ||
6 | } | 7 | } |
7 | } | 8 | } |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7724.h b/arch/sh/include/cpu-sh4/cpu/sh7724.h index fbbf550cc529..4c27b68789b3 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7724.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7724.h | |||
@@ -9,6 +9,7 @@ | |||
9 | * MD3: BSC - Area0 Bus Width (16/32-bit) [CS0BCR.9,10] | 9 | * MD3: BSC - Area0 Bus Width (16/32-bit) [CS0BCR.9,10] |
10 | * MD5: BSC - Endian Mode (L: Big, H: Little) [CMNCR.3] | 10 | * MD5: BSC - Endian Mode (L: Big, H: Little) [CMNCR.3] |
11 | * MD8: Test Mode | 11 | * MD8: Test Mode |
12 | * BOOT: FBR - Boot Mode (L: MMCIF, H: Area0) | ||
12 | */ | 13 | */ |
13 | 14 | ||
14 | /* Pin Function Controller: | 15 | /* Pin Function Controller: |
diff --git a/arch/sh/include/mach-common/mach/romimage.h b/arch/sh/include/mach-common/mach/romimage.h index 267e24112d82..08fb42269ecd 100644 --- a/arch/sh/include/mach-common/mach/romimage.h +++ b/arch/sh/include/mach-common/mach/romimage.h | |||
@@ -1 +1,11 @@ | |||
1 | #ifdef __ASSEMBLY__ | ||
2 | |||
1 | /* do nothing here by default */ | 3 | /* do nothing here by default */ |
4 | |||
5 | #else /* __ASSEMBLY__ */ | ||
6 | |||
7 | extern inline void mmcif_update_progress(int nr) | ||
8 | { | ||
9 | } | ||
10 | |||
11 | #endif /* __ASSEMBLY__ */ | ||
diff --git a/arch/sh/include/mach-ecovec24/mach/romimage.h b/arch/sh/include/mach-ecovec24/mach/romimage.h index 1c8787ecb1c1..1dcf5e6c8d83 100644 --- a/arch/sh/include/mach-ecovec24/mach/romimage.h +++ b/arch/sh/include/mach-ecovec24/mach/romimage.h | |||
@@ -1,3 +1,5 @@ | |||
1 | #ifdef __ASSEMBLY__ | ||
2 | |||
1 | /* EcoVec board specific boot code: | 3 | /* EcoVec board specific boot code: |
2 | * converts the "partner-jet-script.txt" script into assembly | 4 | * converts the "partner-jet-script.txt" script into assembly |
3 | * the assembly code is the first code to be executed in the romImage | 5 | * the assembly code is the first code to be executed in the romImage |
@@ -18,3 +20,28 @@ | |||
18 | .align 2 | 20 | .align 2 |
19 | 1 : .long 0xa8000000 | 21 | 1 : .long 0xa8000000 |
20 | 2 : | 22 | 2 : |
23 | |||
24 | #else /* __ASSEMBLY__ */ | ||
25 | |||
26 | /* Ecovec board specific information: | ||
27 | * | ||
28 | * Set the following to enable MMCIF boot from the MMC card in CN12: | ||
29 | * | ||
30 | * DS1.5 = OFF (SH BOOT pin set to L) | ||
31 | * DS2.6 = OFF (Select MMCIF on CN12 instead of SDHI1) | ||
32 | * DS2.7 = ON (Select MMCIF on CN12 instead of SDHI1) | ||
33 | * | ||
34 | */ | ||
35 | #define HIZCRA 0xa4050158 | ||
36 | #define PGDR 0xa405012c | ||
37 | |||
38 | extern inline void mmcif_update_progress(int nr) | ||
39 | { | ||
40 | /* disable Hi-Z for LED pins */ | ||
41 | __raw_writew(__raw_readw(HIZCRA) & ~(1 << 1), HIZCRA); | ||
42 | |||
43 | /* update progress on LED4, LED5, LED6 and LED7 */ | ||
44 | __raw_writeb(1 << (nr - 1), PGDR); | ||
45 | } | ||
46 | |||
47 | #endif /* __ASSEMBLY__ */ | ||
diff --git a/arch/sh/include/mach-kfr2r09/mach/romimage.h b/arch/sh/include/mach-kfr2r09/mach/romimage.h index a110823f2bde..976256a323f2 100644 --- a/arch/sh/include/mach-kfr2r09/mach/romimage.h +++ b/arch/sh/include/mach-kfr2r09/mach/romimage.h | |||
@@ -1,3 +1,5 @@ | |||
1 | #ifdef __ASSEMBLY__ | ||
2 | |||
1 | /* kfr2r09 board specific boot code: | 3 | /* kfr2r09 board specific boot code: |
2 | * converts the "partner-jet-script.txt" script into assembly | 4 | * converts the "partner-jet-script.txt" script into assembly |
3 | * the assembly code is the first code to be executed in the romImage | 5 | * the assembly code is the first code to be executed in the romImage |
@@ -18,3 +20,11 @@ | |||
18 | .align 2 | 20 | .align 2 |
19 | 1: .long 0xa8000000 | 21 | 1: .long 0xa8000000 |
20 | 2: | 22 | 2: |
23 | |||
24 | #else /* __ASSEMBLY__ */ | ||
25 | |||
26 | extern inline void mmcif_update_progress(int nr) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | #endif /* __ASSEMBLY__ */ | ||