diff options
author | Konrad Eisele <konrad@gaisler.com> | 2009-08-16 20:13:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-08-17 21:32:10 -0400 |
commit | 0fd7ef1fe0e6e70c7851ce65a2eb8a8d3f49147e (patch) | |
tree | 5acde580b44e055ce38660bd4185f0da2f1f6468 | |
parent | 97fb58fa9bb509b49090a1c62ed1b660d518c66b (diff) |
sparc,leon: Introduce the sparc-leon CPU type.
Add sparc_leon enum, M_LEON|M_LEON3_SOC machine. Add compilation of
leon.c in mm and kernel
if CONFIG_SPARC_LEON is defined. Add sparc_leon dependent
initialization to switch statements + head.S.
Signed-off-by: Konrad Eisele <konrad@gaisler.com>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/include/asm/machines.h | 6 | ||||
-rw-r--r-- | arch/sparc/include/asm/pgtsrmmu.h | 4 | ||||
-rw-r--r-- | arch/sparc/include/asm/prom.h | 3 | ||||
-rw-r--r-- | arch/sparc/include/asm/system_32.h | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/cpu.c | 5 | ||||
-rw-r--r-- | arch/sparc/kernel/head_32.S | 5 | ||||
-rw-r--r-- | arch/sparc/kernel/idprom.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/irq_32.c | 5 | ||||
-rw-r--r-- | arch/sparc/kernel/setup_32.c | 5 | ||||
-rw-r--r-- | arch/sparc/mm/Makefile | 1 | ||||
-rw-r--r-- | arch/sparc/mm/init_32.c | 4 | ||||
-rw-r--r-- | arch/sparc/mm/loadmmu.c | 1 |
13 files changed, 43 insertions, 1 deletions
diff --git a/arch/sparc/include/asm/machines.h b/arch/sparc/include/asm/machines.h index c28c2f248794..cd9c099567e4 100644 --- a/arch/sparc/include/asm/machines.h +++ b/arch/sparc/include/asm/machines.h | |||
@@ -15,7 +15,7 @@ struct Sun_Machine_Models { | |||
15 | /* Current number of machines we know about that has an IDPROM | 15 | /* Current number of machines we know about that has an IDPROM |
16 | * machtype entry including one entry for the 0x80 OBP machines. | 16 | * machtype entry including one entry for the 0x80 OBP machines. |
17 | */ | 17 | */ |
18 | #define NUM_SUN_MACHINES 15 | 18 | #define NUM_SUN_MACHINES 16 |
19 | 19 | ||
20 | /* The machine type in the idprom area looks like this: | 20 | /* The machine type in the idprom area looks like this: |
21 | * | 21 | * |
@@ -30,6 +30,7 @@ struct Sun_Machine_Models { | |||
30 | 30 | ||
31 | #define SM_ARCH_MASK 0xf0 | 31 | #define SM_ARCH_MASK 0xf0 |
32 | #define SM_SUN4 0x20 | 32 | #define SM_SUN4 0x20 |
33 | #define M_LEON 0x30 | ||
33 | #define SM_SUN4C 0x50 | 34 | #define SM_SUN4C 0x50 |
34 | #define SM_SUN4M 0x70 | 35 | #define SM_SUN4M 0x70 |
35 | #define SM_SUN4M_OBP 0x80 | 36 | #define SM_SUN4M_OBP 0x80 |
@@ -41,6 +42,9 @@ struct Sun_Machine_Models { | |||
41 | #define SM_4_330 0x03 /* Sun 4/300 series */ | 42 | #define SM_4_330 0x03 /* Sun 4/300 series */ |
42 | #define SM_4_470 0x04 /* Sun 4/400 series */ | 43 | #define SM_4_470 0x04 /* Sun 4/400 series */ |
43 | 44 | ||
45 | /* Leon machines */ | ||
46 | #define M_LEON3_SOC 0x02 /* Leon3 SoC */ | ||
47 | |||
44 | /* Sun4c machines Full Name - PROM NAME */ | 48 | /* Sun4c machines Full Name - PROM NAME */ |
45 | #define SM_4C_SS1 0x01 /* Sun4c SparcStation 1 - Sun 4/60 */ | 49 | #define SM_4C_SS1 0x01 /* Sun4c SparcStation 1 - Sun 4/60 */ |
46 | #define SM_4C_IPC 0x02 /* Sun4c SparcStation IPC - Sun 4/40 */ | 50 | #define SM_4C_IPC 0x02 /* Sun4c SparcStation IPC - Sun 4/40 */ |
diff --git a/arch/sparc/include/asm/pgtsrmmu.h b/arch/sparc/include/asm/pgtsrmmu.h index 808555fc1d58..1407c07bdade 100644 --- a/arch/sparc/include/asm/pgtsrmmu.h +++ b/arch/sparc/include/asm/pgtsrmmu.h | |||
@@ -267,6 +267,7 @@ static inline void srmmu_flush_tlb_page(unsigned long page) | |||
267 | 267 | ||
268 | } | 268 | } |
269 | 269 | ||
270 | #ifndef CONFIG_SPARC_LEON | ||
270 | static inline unsigned long srmmu_hwprobe(unsigned long vaddr) | 271 | static inline unsigned long srmmu_hwprobe(unsigned long vaddr) |
271 | { | 272 | { |
272 | unsigned long retval; | 273 | unsigned long retval; |
@@ -278,6 +279,9 @@ static inline unsigned long srmmu_hwprobe(unsigned long vaddr) | |||
278 | 279 | ||
279 | return retval; | 280 | return retval; |
280 | } | 281 | } |
282 | #else | ||
283 | #define srmmu_hwprobe(addr) (srmmu_swprobe(addr, 0) & SRMMU_PTE_PMASK) | ||
284 | #endif | ||
281 | 285 | ||
282 | static inline int | 286 | static inline int |
283 | srmmu_get_pte (unsigned long addr) | 287 | srmmu_get_pte (unsigned long addr) |
diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h index be8d7aaeb60d..82a190d7efc1 100644 --- a/arch/sparc/include/asm/prom.h +++ b/arch/sparc/include/asm/prom.h | |||
@@ -118,5 +118,8 @@ extern struct device_node *of_console_device; | |||
118 | extern char *of_console_path; | 118 | extern char *of_console_path; |
119 | extern char *of_console_options; | 119 | extern char *of_console_options; |
120 | 120 | ||
121 | extern void (*prom_build_more)(struct device_node *dp, struct device_node ***nextp); | ||
122 | extern char *build_full_name(struct device_node *dp); | ||
123 | |||
121 | #endif /* __KERNEL__ */ | 124 | #endif /* __KERNEL__ */ |
122 | #endif /* _SPARC_PROM_H */ | 125 | #endif /* _SPARC_PROM_H */ |
diff --git a/arch/sparc/include/asm/system_32.h b/arch/sparc/include/asm/system_32.h index 751c8c17f5a0..890036b3689a 100644 --- a/arch/sparc/include/asm/system_32.h +++ b/arch/sparc/include/asm/system_32.h | |||
@@ -32,6 +32,7 @@ enum sparc_cpu { | |||
32 | sun4u = 0x05, /* V8 ploos ploos */ | 32 | sun4u = 0x05, /* V8 ploos ploos */ |
33 | sun_unknown = 0x06, | 33 | sun_unknown = 0x06, |
34 | ap1000 = 0x07, /* almost a sun4m */ | 34 | ap1000 = 0x07, /* almost a sun4m */ |
35 | sparc_leon = 0x08, /* Leon SoC */ | ||
35 | }; | 36 | }; |
36 | 37 | ||
37 | /* Really, userland should not be looking at any of this... */ | 38 | /* Really, userland should not be looking at any of this... */ |
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index 475ce4696acd..b0041756c9f0 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile | |||
@@ -41,6 +41,8 @@ obj-y += of_device_common.o | |||
41 | obj-y += of_device_$(BITS).o | 41 | obj-y += of_device_$(BITS).o |
42 | obj-$(CONFIG_SPARC64) += prom_irqtrans.o | 42 | obj-$(CONFIG_SPARC64) += prom_irqtrans.o |
43 | 43 | ||
44 | obj-$(CONFIG_SPARC_LEON)+= leon_kernel.o | ||
45 | |||
44 | obj-$(CONFIG_SPARC64) += reboot.o | 46 | obj-$(CONFIG_SPARC64) += reboot.o |
45 | obj-$(CONFIG_SPARC64) += sysfs.o | 47 | obj-$(CONFIG_SPARC64) += sysfs.o |
46 | obj-$(CONFIG_SPARC64) += iommu.o | 48 | obj-$(CONFIG_SPARC64) += iommu.o |
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index d85c3dc4953a..1446df90ef85 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -312,7 +312,12 @@ void __cpuinit cpu_probe(void) | |||
312 | 312 | ||
313 | psr = get_psr(); | 313 | psr = get_psr(); |
314 | put_psr(psr | PSR_EF); | 314 | put_psr(psr | PSR_EF); |
315 | #ifdef CONFIG_SPARC_LEON | ||
316 | fpu_vers = 7; | ||
317 | #else | ||
315 | fpu_vers = ((get_fsr() >> 17) & 0x7); | 318 | fpu_vers = ((get_fsr() >> 17) & 0x7); |
319 | #endif | ||
320 | |||
316 | put_psr(psr); | 321 | put_psr(psr); |
317 | 322 | ||
318 | set_cpu_and_fpu(psr_impl, psr_vers, fpu_vers); | 323 | set_cpu_and_fpu(psr_impl, psr_vers, fpu_vers); |
diff --git a/arch/sparc/kernel/head_32.S b/arch/sparc/kernel/head_32.S index 6b4d8acc4c83..439d82a95ac9 100644 --- a/arch/sparc/kernel/head_32.S +++ b/arch/sparc/kernel/head_32.S | |||
@@ -809,6 +809,11 @@ found_version: | |||
809 | nop | 809 | nop |
810 | 810 | ||
811 | got_prop: | 811 | got_prop: |
812 | #ifdef CONFIG_SPARC_LEON | ||
813 | /* no cpu-type check is needed, it is a SPARC-LEON */ | ||
814 | ba sun4c_continue_boot | ||
815 | nop | ||
816 | #endif | ||
812 | set cputypval, %o2 | 817 | set cputypval, %o2 |
813 | ldub [%o2 + 0x4], %l1 | 818 | ldub [%o2 + 0x4], %l1 |
814 | 819 | ||
diff --git a/arch/sparc/kernel/idprom.c b/arch/sparc/kernel/idprom.c index 57922f69c3f7..52a15fe2db19 100644 --- a/arch/sparc/kernel/idprom.c +++ b/arch/sparc/kernel/idprom.c | |||
@@ -31,6 +31,8 @@ static struct Sun_Machine_Models Sun_Machines[NUM_SUN_MACHINES] = { | |||
31 | { .name = "Sun 4/200 Series", .id_machtype = (SM_SUN4 | SM_4_260) }, | 31 | { .name = "Sun 4/200 Series", .id_machtype = (SM_SUN4 | SM_4_260) }, |
32 | { .name = "Sun 4/300 Series", .id_machtype = (SM_SUN4 | SM_4_330) }, | 32 | { .name = "Sun 4/300 Series", .id_machtype = (SM_SUN4 | SM_4_330) }, |
33 | { .name = "Sun 4/400 Series", .id_machtype = (SM_SUN4 | SM_4_470) }, | 33 | { .name = "Sun 4/400 Series", .id_machtype = (SM_SUN4 | SM_4_470) }, |
34 | /* Now Leon */ | ||
35 | { .name = "Leon3 System-on-a-Chip", .id_machtype = (M_LEON | M_LEON3_SOC) }, | ||
34 | /* Now, Sun4c's */ | 36 | /* Now, Sun4c's */ |
35 | { .name = "Sun4c SparcStation 1", .id_machtype = (SM_SUN4C | SM_4C_SS1) }, | 37 | { .name = "Sun4c SparcStation 1", .id_machtype = (SM_SUN4C | SM_4C_SS1) }, |
36 | { .name = "Sun4c SparcStation IPC", .id_machtype = (SM_SUN4C | SM_4C_IPC) }, | 38 | { .name = "Sun4c SparcStation IPC", .id_machtype = (SM_SUN4C | SM_4C_IPC) }, |
diff --git a/arch/sparc/kernel/irq_32.c b/arch/sparc/kernel/irq_32.c index ad800b80c718..e1af43728329 100644 --- a/arch/sparc/kernel/irq_32.c +++ b/arch/sparc/kernel/irq_32.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/pcic.h> | 45 | #include <asm/pcic.h> |
46 | #include <asm/cacheflush.h> | 46 | #include <asm/cacheflush.h> |
47 | #include <asm/irq_regs.h> | 47 | #include <asm/irq_regs.h> |
48 | #include <asm/leon.h> | ||
48 | 49 | ||
49 | #include "kernel.h" | 50 | #include "kernel.h" |
50 | #include "irq.h" | 51 | #include "irq.h" |
@@ -661,6 +662,10 @@ void __init init_IRQ(void) | |||
661 | sun4d_init_IRQ(); | 662 | sun4d_init_IRQ(); |
662 | break; | 663 | break; |
663 | 664 | ||
665 | case sparc_leon: | ||
666 | leon_init_IRQ(); | ||
667 | break; | ||
668 | |||
664 | default: | 669 | default: |
665 | prom_printf("Cannot initialize IRQs on this Sun machine..."); | 670 | prom_printf("Cannot initialize IRQs on this Sun machine..."); |
666 | break; | 671 | break; |
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 998cadb4e7f2..16a47ffe03c1 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c | |||
@@ -235,6 +235,8 @@ void __init setup_arch(char **cmdline_p) | |||
235 | sparc_cpu_model = sun4e; | 235 | sparc_cpu_model = sun4e; |
236 | if (!strcmp(&cputypval,"sun4u")) | 236 | if (!strcmp(&cputypval,"sun4u")) |
237 | sparc_cpu_model = sun4u; | 237 | sparc_cpu_model = sun4u; |
238 | if (!strncmp(&cputypval, "leon" , 4)) | ||
239 | sparc_cpu_model = sparc_leon; | ||
238 | 240 | ||
239 | printk("ARCH: "); | 241 | printk("ARCH: "); |
240 | switch(sparc_cpu_model) { | 242 | switch(sparc_cpu_model) { |
@@ -256,6 +258,9 @@ void __init setup_arch(char **cmdline_p) | |||
256 | case sun4u: | 258 | case sun4u: |
257 | printk("SUN4U\n"); | 259 | printk("SUN4U\n"); |
258 | break; | 260 | break; |
261 | case sparc_leon: | ||
262 | printk("LEON\n"); | ||
263 | break; | ||
259 | default: | 264 | default: |
260 | printk("UNKNOWN!\n"); | 265 | printk("UNKNOWN!\n"); |
261 | break; | 266 | break; |
diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile index 681abe0a4594..79836a7dd00c 100644 --- a/arch/sparc/mm/Makefile +++ b/arch/sparc/mm/Makefile | |||
@@ -11,6 +11,7 @@ obj-$(CONFIG_SPARC32) += loadmmu.o | |||
11 | obj-y += generic_$(BITS).o | 11 | obj-y += generic_$(BITS).o |
12 | obj-$(CONFIG_SPARC32) += extable.o btfixup.o srmmu.o iommu.o io-unit.o | 12 | obj-$(CONFIG_SPARC32) += extable.o btfixup.o srmmu.o iommu.o io-unit.o |
13 | obj-$(CONFIG_SPARC32) += hypersparc.o viking.o tsunami.o swift.o | 13 | obj-$(CONFIG_SPARC32) += hypersparc.o viking.o tsunami.o swift.o |
14 | obj-$(CONFIG_SPARC_LEON)+= leon_mm.o | ||
14 | 15 | ||
15 | # Only used by sparc64 | 16 | # Only used by sparc64 |
16 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 17 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c index 26bb3919ff1f..54114ad0bdee 100644 --- a/arch/sparc/mm/init_32.c +++ b/arch/sparc/mm/init_32.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/pgalloc.h> /* bug in asm-generic/tlb.h: check_pgt_cache */ | 34 | #include <asm/pgalloc.h> /* bug in asm-generic/tlb.h: check_pgt_cache */ |
35 | #include <asm/tlb.h> | 35 | #include <asm/tlb.h> |
36 | #include <asm/prom.h> | 36 | #include <asm/prom.h> |
37 | #include <asm/leon.h> | ||
37 | 38 | ||
38 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 39 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
39 | 40 | ||
@@ -326,6 +327,9 @@ void __init paging_init(void) | |||
326 | sparc_unmapped_base = 0xe0000000; | 327 | sparc_unmapped_base = 0xe0000000; |
327 | BTFIXUPSET_SETHI(sparc_unmapped_base, 0xe0000000); | 328 | BTFIXUPSET_SETHI(sparc_unmapped_base, 0xe0000000); |
328 | break; | 329 | break; |
330 | case sparc_leon: | ||
331 | leon_init(); | ||
332 | /* fall through */ | ||
329 | case sun4m: | 333 | case sun4m: |
330 | case sun4d: | 334 | case sun4d: |
331 | srmmu_paging_init(); | 335 | srmmu_paging_init(); |
diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c index 652be05acbea..82ec8f666036 100644 --- a/arch/sparc/mm/loadmmu.c +++ b/arch/sparc/mm/loadmmu.c | |||
@@ -33,6 +33,7 @@ void __init load_mmu(void) | |||
33 | break; | 33 | break; |
34 | case sun4m: | 34 | case sun4m: |
35 | case sun4d: | 35 | case sun4d: |
36 | case sparc_leon: | ||
36 | ld_mmu_srmmu(); | 37 | ld_mmu_srmmu(); |
37 | break; | 38 | break; |
38 | default: | 39 | default: |