diff options
Diffstat (limited to 'arch/mips')
| -rw-r--r-- | arch/mips/Kconfig | 4 | ||||
| -rw-r--r-- | arch/mips/Makefile | 4 | ||||
| -rw-r--r-- | arch/mips/arc/arc_con.c | 2 | ||||
| -rw-r--r-- | arch/mips/arc/misc.c | 19 | ||||
| -rw-r--r-- | arch/mips/au1000/common/reset.c | 10 | ||||
| -rw-r--r-- | arch/mips/kernel/irq-mv6434x.c | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/time.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 4 | ||||
| -rw-r--r-- | arch/mips/mm/c-r4k.c | 13 | ||||
| -rw-r--r-- | arch/mips/mm/c-tx39.c | 1 | ||||
| -rw-r--r-- | arch/mips/mm/tlbex.c | 34 | ||||
| -rw-r--r-- | arch/mips/momentum/jaguar_atx/prom.c | 2 | ||||
| -rw-r--r-- | arch/mips/momentum/jaguar_atx/setup.c | 5 | ||||
| -rw-r--r-- | arch/mips/momentum/ocelot_c/irq.c | 2 | ||||
| -rw-r--r-- | arch/mips/momentum/ocelot_c/prom.c | 2 | ||||
| -rw-r--r-- | arch/mips/momentum/ocelot_c/setup.c | 27 | ||||
| -rw-r--r-- | arch/mips/pci/pci-ocelot-c.c | 6 | ||||
| -rw-r--r-- | arch/mips/sibyte/sb1250/time.c | 77 | ||||
| -rw-r--r-- | arch/mips/sibyte/swarm/setup.c | 7 |
19 files changed, 142 insertions, 91 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 767de847b4ab..3a0f89d2c8dc 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1053,6 +1053,7 @@ config CPU_MIPS32_R1 | |||
| 1053 | depends on SYS_HAS_CPU_MIPS32_R1 | 1053 | depends on SYS_HAS_CPU_MIPS32_R1 |
| 1054 | select CPU_HAS_PREFETCH | 1054 | select CPU_HAS_PREFETCH |
| 1055 | select CPU_SUPPORTS_32BIT_KERNEL | 1055 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1056 | select CPU_SUPPORTS_HIGHMEM | ||
| 1056 | help | 1057 | help |
| 1057 | Choose this option to build a kernel for release 1 or later of the | 1058 | Choose this option to build a kernel for release 1 or later of the |
| 1058 | MIPS32 architecture. Most modern embedded systems with a 32-bit | 1059 | MIPS32 architecture. Most modern embedded systems with a 32-bit |
| @@ -1069,6 +1070,7 @@ config CPU_MIPS32_R2 | |||
| 1069 | depends on SYS_HAS_CPU_MIPS32_R2 | 1070 | depends on SYS_HAS_CPU_MIPS32_R2 |
| 1070 | select CPU_HAS_PREFETCH | 1071 | select CPU_HAS_PREFETCH |
| 1071 | select CPU_SUPPORTS_32BIT_KERNEL | 1072 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1073 | select CPU_SUPPORTS_HIGHMEM | ||
| 1072 | help | 1074 | help |
| 1073 | Choose this option to build a kernel for release 2 or later of the | 1075 | Choose this option to build a kernel for release 2 or later of the |
| 1074 | MIPS32 architecture. Most modern embedded systems with a 32-bit | 1076 | MIPS32 architecture. Most modern embedded systems with a 32-bit |
| @@ -1082,6 +1084,7 @@ config CPU_MIPS64_R1 | |||
| 1082 | select CPU_HAS_PREFETCH | 1084 | select CPU_HAS_PREFETCH |
| 1083 | select CPU_SUPPORTS_32BIT_KERNEL | 1085 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1084 | select CPU_SUPPORTS_64BIT_KERNEL | 1086 | select CPU_SUPPORTS_64BIT_KERNEL |
| 1087 | select CPU_SUPPORTS_HIGHMEM | ||
| 1085 | help | 1088 | help |
| 1086 | Choose this option to build a kernel for release 1 or later of the | 1089 | Choose this option to build a kernel for release 1 or later of the |
| 1087 | MIPS64 architecture. Many modern embedded systems with a 64-bit | 1090 | MIPS64 architecture. Many modern embedded systems with a 64-bit |
| @@ -1099,6 +1102,7 @@ config CPU_MIPS64_R2 | |||
| 1099 | select CPU_HAS_PREFETCH | 1102 | select CPU_HAS_PREFETCH |
| 1100 | select CPU_SUPPORTS_32BIT_KERNEL | 1103 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1101 | select CPU_SUPPORTS_64BIT_KERNEL | 1104 | select CPU_SUPPORTS_64BIT_KERNEL |
| 1105 | select CPU_SUPPORTS_HIGHMEM | ||
| 1102 | help | 1106 | help |
| 1103 | Choose this option to build a kernel for release 2 or later of the | 1107 | Choose this option to build a kernel for release 2 or later of the |
| 1104 | MIPS64 architecture. Many modern embedded systems with a 64-bit | 1108 | MIPS64 architecture. Many modern embedded systems with a 64-bit |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 38c0f3360d51..3d8dac681c63 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
| @@ -95,6 +95,7 @@ endif | |||
| 95 | # crossformat linking we rely on the elf2ecoff tool for format conversion. | 95 | # crossformat linking we rely on the elf2ecoff tool for format conversion. |
| 96 | # | 96 | # |
| 97 | cflags-y += -G 0 -mno-abicalls -fno-pic -pipe | 97 | cflags-y += -G 0 -mno-abicalls -fno-pic -pipe |
| 98 | cflags-y += -msoft-float | ||
| 98 | LDFLAGS_vmlinux += -G 0 -static -n -nostdlib | 99 | LDFLAGS_vmlinux += -G 0 -static -n -nostdlib |
| 99 | MODFLAGS += -mlong-calls | 100 | MODFLAGS += -mlong-calls |
| 100 | 101 | ||
| @@ -107,7 +108,8 @@ MODFLAGS += -mlong-calls | |||
| 107 | cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB) | 108 | cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB) |
| 108 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL) | 109 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL) |
| 109 | 110 | ||
| 110 | cflags-$(CONFIG_SB1XXX_CORELIS) += -mno-sched-prolog -fno-omit-frame-pointer | 111 | cflags-$(CONFIG_SB1XXX_CORELIS) += $(call cc-option,-mno-sched-prolog) \ |
| 112 | -fno-omit-frame-pointer | ||
| 111 | 113 | ||
| 112 | # | 114 | # |
| 113 | # Use: $(call set_gccflags,<cpu0>,<isa0>,<cpu1>,<isa1>,<isa2>) | 115 | # Use: $(call set_gccflags,<cpu0>,<isa0>,<cpu1>,<isa1>,<isa2>) |
diff --git a/arch/mips/arc/arc_con.c b/arch/mips/arc/arc_con.c index 51785a6a7328..bc32fe64f42a 100644 --- a/arch/mips/arc/arc_con.c +++ b/arch/mips/arc/arc_con.c | |||
| @@ -24,7 +24,7 @@ static void prom_console_write(struct console *co, const char *s, | |||
| 24 | } | 24 | } |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | static int __init prom_console_setup(struct console *co, char *options) | 27 | static int prom_console_setup(struct console *co, char *options) |
| 28 | { | 28 | { |
| 29 | return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); | 29 | return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); |
| 30 | } | 30 | } |
diff --git a/arch/mips/arc/misc.c b/arch/mips/arc/misc.c index 84867de22028..b2e10b9e9452 100644 --- a/arch/mips/arc/misc.c +++ b/arch/mips/arc/misc.c | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | * Copyright (C) 1999 Ralf Baechle (ralf@gnu.org) | 9 | * Copyright (C) 1999 Ralf Baechle (ralf@gnu.org) |
| 10 | * Copyright (C) 1999 Silicon Graphics, Inc. | 10 | * Copyright (C) 1999 Silicon Graphics, Inc. |
| 11 | */ | 11 | */ |
| 12 | #include <linux/config.h> | ||
| 13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 15 | 14 | ||
| @@ -20,17 +19,11 @@ | |||
| 20 | #include <asm/bootinfo.h> | 19 | #include <asm/bootinfo.h> |
| 21 | #include <asm/system.h> | 20 | #include <asm/system.h> |
| 22 | 21 | ||
| 23 | extern void *sgiwd93_host; | ||
| 24 | extern void reset_wd33c93(void *instance); | ||
| 25 | |||
| 26 | VOID | 22 | VOID |
| 27 | ArcHalt(VOID) | 23 | ArcHalt(VOID) |
| 28 | { | 24 | { |
| 29 | bc_disable(); | 25 | bc_disable(); |
| 30 | local_irq_disable(); | 26 | local_irq_disable(); |
| 31 | #ifdef CONFIG_SCSI_SGIWD93 | ||
| 32 | reset_wd33c93(sgiwd93_host); | ||
| 33 | #endif | ||
| 34 | ARC_CALL0(halt); | 27 | ARC_CALL0(halt); |
| 35 | never: goto never; | 28 | never: goto never; |
| 36 | } | 29 | } |
| @@ -40,9 +33,6 @@ ArcPowerDown(VOID) | |||
| 40 | { | 33 | { |
| 41 | bc_disable(); | 34 | bc_disable(); |
| 42 | local_irq_disable(); | 35 | local_irq_disable(); |
| 43 | #ifdef CONFIG_SCSI_SGIWD93 | ||
| 44 | reset_wd33c93(sgiwd93_host); | ||
| 45 | #endif | ||
| 46 | ARC_CALL0(pdown); | 36 | ARC_CALL0(pdown); |
| 47 | never: goto never; | 37 | never: goto never; |
| 48 | } | 38 | } |
| @@ -53,9 +43,6 @@ ArcRestart(VOID) | |||
| 53 | { | 43 | { |
| 54 | bc_disable(); | 44 | bc_disable(); |
| 55 | local_irq_disable(); | 45 | local_irq_disable(); |
| 56 | #ifdef CONFIG_SCSI_SGIWD93 | ||
| 57 | reset_wd33c93(sgiwd93_host); | ||
| 58 | #endif | ||
| 59 | ARC_CALL0(restart); | 46 | ARC_CALL0(restart); |
| 60 | never: goto never; | 47 | never: goto never; |
| 61 | } | 48 | } |
| @@ -65,9 +52,6 @@ ArcReboot(VOID) | |||
| 65 | { | 52 | { |
| 66 | bc_disable(); | 53 | bc_disable(); |
| 67 | local_irq_disable(); | 54 | local_irq_disable(); |
| 68 | #ifdef CONFIG_SCSI_SGIWD93 | ||
| 69 | reset_wd33c93(sgiwd93_host); | ||
| 70 | #endif | ||
| 71 | ARC_CALL0(reboot); | 55 | ARC_CALL0(reboot); |
| 72 | never: goto never; | 56 | never: goto never; |
| 73 | } | 57 | } |
| @@ -77,9 +61,6 @@ ArcEnterInteractiveMode(VOID) | |||
| 77 | { | 61 | { |
| 78 | bc_disable(); | 62 | bc_disable(); |
| 79 | local_irq_disable(); | 63 | local_irq_disable(); |
| 80 | #ifdef CONFIG_SCSI_SGIWD93 | ||
| 81 | reset_wd33c93(sgiwd93_host); | ||
| 82 | #endif | ||
| 83 | ARC_CALL0(imode); | 64 | ARC_CALL0(imode); |
| 84 | never: goto never; | 65 | never: goto never; |
| 85 | } | 66 | } |
diff --git a/arch/mips/au1000/common/reset.c b/arch/mips/au1000/common/reset.c index 4ffccedf5967..c93af224c1b3 100644 --- a/arch/mips/au1000/common/reset.c +++ b/arch/mips/au1000/common/reset.c | |||
| @@ -164,17 +164,20 @@ void au1000_restart(char *command) | |||
| 164 | 164 | ||
| 165 | void au1000_halt(void) | 165 | void au1000_halt(void) |
| 166 | { | 166 | { |
| 167 | #if defined(CONFIG_MIPS_PB1550) | 167 | #if defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) |
| 168 | /* power off system */ | 168 | /* power off system */ |
| 169 | printk("\n** Powering off Pb1550\n"); | 169 | printk("\n** Powering off...\n"); |
| 170 | au_writew(au_readw(0xAF00001C) | (3<<14), 0xAF00001C); | 170 | au_writew(au_readw(0xAF00001C) | (3<<14), 0xAF00001C); |
| 171 | au_sync(); | 171 | au_sync(); |
| 172 | while(1); /* should not get here */ | 172 | while(1); /* should not get here */ |
| 173 | #endif | 173 | #else |
| 174 | printk(KERN_NOTICE "\n** You can safely turn off the power\n"); | 174 | printk(KERN_NOTICE "\n** You can safely turn off the power\n"); |
| 175 | #ifdef CONFIG_MIPS_MIRAGE | 175 | #ifdef CONFIG_MIPS_MIRAGE |
| 176 | au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT); | 176 | au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT); |
| 177 | #endif | 177 | #endif |
| 178 | #ifdef CONFIG_MIPS_DB1200 | ||
| 179 | au_writew(au_readw(0xB980001C) | (1<<14), 0xB980001C); | ||
| 180 | #endif | ||
| 178 | #ifdef CONFIG_PM | 181 | #ifdef CONFIG_PM |
| 179 | au_sleep(); | 182 | au_sleep(); |
| 180 | 183 | ||
| @@ -187,6 +190,7 @@ void au1000_halt(void) | |||
| 187 | "wait\n\t" | 190 | "wait\n\t" |
| 188 | ".set\tmips0"); | 191 | ".set\tmips0"); |
| 189 | #endif | 192 | #endif |
| 193 | #endif /* defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) */ | ||
| 190 | } | 194 | } |
| 191 | 195 | ||
| 192 | void au1000_power_off(void) | 196 | void au1000_power_off(void) |
diff --git a/arch/mips/kernel/irq-mv6434x.c b/arch/mips/kernel/irq-mv6434x.c index 0ac067f45cf5..0613f1f36b1b 100644 --- a/arch/mips/kernel/irq-mv6434x.c +++ b/arch/mips/kernel/irq-mv6434x.c | |||
| @@ -11,12 +11,14 @@ | |||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <asm/ptrace.h> | ||
| 15 | #include <linux/sched.h> | ||
| 16 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> |
| 15 | #include <linux/mv643xx.h> | ||
| 16 | #include <linux/sched.h> | ||
| 17 | |||
| 18 | #include <asm/ptrace.h> | ||
| 17 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 18 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
| 19 | #include <linux/mv643xx.h> | 21 | #include <asm/marvell.h> |
| 20 | 22 | ||
| 21 | static unsigned int irq_base; | 23 | static unsigned int irq_base; |
| 22 | 24 | ||
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c index 42c94c771afb..51273b7297a7 100644 --- a/arch/mips/kernel/time.c +++ b/arch/mips/kernel/time.c | |||
| @@ -424,6 +424,8 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 424 | unsigned long j; | 424 | unsigned long j; |
| 425 | unsigned int count; | 425 | unsigned int count; |
| 426 | 426 | ||
| 427 | write_seqlock(&xtime_lock); | ||
| 428 | |||
| 427 | count = mips_hpt_read(); | 429 | count = mips_hpt_read(); |
| 428 | mips_timer_ack(); | 430 | mips_timer_ack(); |
| 429 | 431 | ||
| @@ -441,7 +443,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 441 | * CMOS clock accordingly every ~11 minutes. rtc_set_time() has to be | 443 | * CMOS clock accordingly every ~11 minutes. rtc_set_time() has to be |
| 442 | * called as close as possible to 500 ms before the new second starts. | 444 | * called as close as possible to 500 ms before the new second starts. |
| 443 | */ | 445 | */ |
| 444 | write_seqlock(&xtime_lock); | ||
| 445 | if (ntp_synced() && | 446 | if (ntp_synced() && |
| 446 | xtime.tv_sec > last_rtc_update + 660 && | 447 | xtime.tv_sec > last_rtc_update + 660 && |
| 447 | (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 && | 448 | (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 && |
| @@ -453,7 +454,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 453 | last_rtc_update = xtime.tv_sec - 600; | 454 | last_rtc_update = xtime.tv_sec - 600; |
| 454 | } | 455 | } |
| 455 | } | 456 | } |
| 456 | write_sequnlock(&xtime_lock); | ||
| 457 | 457 | ||
| 458 | /* | 458 | /* |
| 459 | * If jiffies has overflown in this timer_interrupt, we must | 459 | * If jiffies has overflown in this timer_interrupt, we must |
| @@ -496,6 +496,8 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 496 | } | 496 | } |
| 497 | } | 497 | } |
| 498 | 498 | ||
| 499 | write_sequnlock(&xtime_lock); | ||
| 500 | |||
| 499 | /* | 501 | /* |
| 500 | * In UP mode, we call local_timer_interrupt() to do profiling | 502 | * In UP mode, we call local_timer_interrupt() to do profiling |
| 501 | * and process accouting. | 503 | * and process accouting. |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index ff699dbb99f7..2ad0cedf29fe 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
| @@ -106,6 +106,9 @@ SECTIONS | |||
| 106 | .con_initcall.init : { *(.con_initcall.init) } | 106 | .con_initcall.init : { *(.con_initcall.init) } |
| 107 | __con_initcall_end = .; | 107 | __con_initcall_end = .; |
| 108 | SECURITY_INIT | 108 | SECURITY_INIT |
| 109 | /* .exit.text is discarded at runtime, not link time, to deal with | ||
| 110 | references from .rodata */ | ||
| 111 | .exit.text : { *(.exit.text) } | ||
| 109 | . = ALIGN(_PAGE_SIZE); | 112 | . = ALIGN(_PAGE_SIZE); |
| 110 | __initramfs_start = .; | 113 | __initramfs_start = .; |
| 111 | .init.ramfs : { *(.init.ramfs) } | 114 | .init.ramfs : { *(.init.ramfs) } |
| @@ -133,7 +136,6 @@ SECTIONS | |||
| 133 | 136 | ||
| 134 | /* Sections to be discarded */ | 137 | /* Sections to be discarded */ |
| 135 | /DISCARD/ : { | 138 | /DISCARD/ : { |
| 136 | *(.exit.text) | ||
| 137 | *(.exit.data) | 139 | *(.exit.data) |
| 138 | *(.exitcall.exit) | 140 | *(.exitcall.exit) |
| 139 | 141 | ||
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 0668e9bfce41..9572ed44f0d5 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -375,6 +375,7 @@ static void r4k_flush_cache_mm(struct mm_struct *mm) | |||
| 375 | struct flush_cache_page_args { | 375 | struct flush_cache_page_args { |
| 376 | struct vm_area_struct *vma; | 376 | struct vm_area_struct *vma; |
| 377 | unsigned long addr; | 377 | unsigned long addr; |
| 378 | unsigned long pfn; | ||
| 378 | }; | 379 | }; |
| 379 | 380 | ||
| 380 | static inline void local_r4k_flush_cache_page(void *args) | 381 | static inline void local_r4k_flush_cache_page(void *args) |
| @@ -382,6 +383,7 @@ static inline void local_r4k_flush_cache_page(void *args) | |||
| 382 | struct flush_cache_page_args *fcp_args = args; | 383 | struct flush_cache_page_args *fcp_args = args; |
| 383 | struct vm_area_struct *vma = fcp_args->vma; | 384 | struct vm_area_struct *vma = fcp_args->vma; |
| 384 | unsigned long addr = fcp_args->addr; | 385 | unsigned long addr = fcp_args->addr; |
| 386 | unsigned long paddr = fcp_args->pfn << PAGE_SHIFT; | ||
| 385 | int exec = vma->vm_flags & VM_EXEC; | 387 | int exec = vma->vm_flags & VM_EXEC; |
| 386 | struct mm_struct *mm = vma->vm_mm; | 388 | struct mm_struct *mm = vma->vm_mm; |
| 387 | pgd_t *pgdp; | 389 | pgd_t *pgdp; |
| @@ -431,11 +433,12 @@ static inline void local_r4k_flush_cache_page(void *args) | |||
| 431 | * Do indexed flush, too much work to get the (possible) TLB refills | 433 | * Do indexed flush, too much work to get the (possible) TLB refills |
| 432 | * to work correctly. | 434 | * to work correctly. |
| 433 | */ | 435 | */ |
| 434 | addr = INDEX_BASE + (addr & (dcache_size - 1)); | ||
| 435 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { | 436 | if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc)) { |
| 436 | r4k_blast_dcache_page_indexed(addr); | 437 | r4k_blast_dcache_page_indexed(cpu_has_pindexed_dcache ? |
| 437 | if (exec && !cpu_icache_snoops_remote_store) | 438 | paddr : addr); |
| 438 | r4k_blast_scache_page_indexed(addr); | 439 | if (exec && !cpu_icache_snoops_remote_store) { |
| 440 | r4k_blast_scache_page_indexed(paddr); | ||
| 441 | } | ||
| 439 | } | 442 | } |
| 440 | if (exec) { | 443 | if (exec) { |
| 441 | if (cpu_has_vtag_icache) { | 444 | if (cpu_has_vtag_icache) { |
| @@ -455,6 +458,7 @@ static void r4k_flush_cache_page(struct vm_area_struct *vma, | |||
| 455 | 458 | ||
| 456 | args.vma = vma; | 459 | args.vma = vma; |
| 457 | args.addr = addr; | 460 | args.addr = addr; |
| 461 | args.pfn = pfn; | ||
| 458 | 462 | ||
| 459 | on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1); | 463 | on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1); |
| 460 | } | 464 | } |
| @@ -956,6 +960,7 @@ static void __init probe_pcache(void) | |||
| 956 | switch (c->cputype) { | 960 | switch (c->cputype) { |
| 957 | case CPU_20KC: | 961 | case CPU_20KC: |
| 958 | case CPU_25KF: | 962 | case CPU_25KF: |
| 963 | c->dcache.flags |= MIPS_CACHE_PINDEX; | ||
| 959 | case CPU_R10000: | 964 | case CPU_R10000: |
| 960 | case CPU_R12000: | 965 | case CPU_R12000: |
| 961 | case CPU_SB1: | 966 | case CPU_SB1: |
diff --git a/arch/mips/mm/c-tx39.c b/arch/mips/mm/c-tx39.c index 7c572bea4a98..fe232e3988e3 100644 --- a/arch/mips/mm/c-tx39.c +++ b/arch/mips/mm/c-tx39.c | |||
| @@ -210,7 +210,6 @@ static void tx39_flush_cache_page(struct vm_area_struct *vma, unsigned long page | |||
| 210 | * Do indexed flush, too much work to get the (possible) TLB refills | 210 | * Do indexed flush, too much work to get the (possible) TLB refills |
| 211 | * to work correctly. | 211 | * to work correctly. |
| 212 | */ | 212 | */ |
| 213 | page = (KSEG0 + (page & (dcache_size - 1))); | ||
| 214 | if (cpu_has_dc_aliases || exec) | 213 | if (cpu_has_dc_aliases || exec) |
| 215 | tx39_blast_dcache_page_indexed(page); | 214 | tx39_blast_dcache_page_indexed(page); |
| 216 | if (exec) | 215 | if (exec) |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 0f9485806bac..ac4f4bfaae50 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
| @@ -280,69 +280,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...) | |||
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | #define I_u1u2u3(op) \ | 282 | #define I_u1u2u3(op) \ |
| 283 | static inline void i##op(u32 **buf, unsigned int a, \ | 283 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 284 | unsigned int b, unsigned int c) \ | 284 | unsigned int b, unsigned int c) \ |
| 285 | { \ | 285 | { \ |
| 286 | build_insn(buf, insn##op, a, b, c); \ | 286 | build_insn(buf, insn##op, a, b, c); \ |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | #define I_u2u1u3(op) \ | 289 | #define I_u2u1u3(op) \ |
| 290 | static inline void i##op(u32 **buf, unsigned int a, \ | 290 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 291 | unsigned int b, unsigned int c) \ | 291 | unsigned int b, unsigned int c) \ |
| 292 | { \ | 292 | { \ |
| 293 | build_insn(buf, insn##op, b, a, c); \ | 293 | build_insn(buf, insn##op, b, a, c); \ |
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | #define I_u3u1u2(op) \ | 296 | #define I_u3u1u2(op) \ |
| 297 | static inline void i##op(u32 **buf, unsigned int a, \ | 297 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 298 | unsigned int b, unsigned int c) \ | 298 | unsigned int b, unsigned int c) \ |
| 299 | { \ | 299 | { \ |
| 300 | build_insn(buf, insn##op, b, c, a); \ | 300 | build_insn(buf, insn##op, b, c, a); \ |
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | #define I_u1u2s3(op) \ | 303 | #define I_u1u2s3(op) \ |
| 304 | static inline void i##op(u32 **buf, unsigned int a, \ | 304 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 305 | unsigned int b, signed int c) \ | 305 | unsigned int b, signed int c) \ |
| 306 | { \ | 306 | { \ |
| 307 | build_insn(buf, insn##op, a, b, c); \ | 307 | build_insn(buf, insn##op, a, b, c); \ |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | #define I_u2s3u1(op) \ | 310 | #define I_u2s3u1(op) \ |
| 311 | static inline void i##op(u32 **buf, unsigned int a, \ | 311 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 312 | signed int b, unsigned int c) \ | 312 | signed int b, unsigned int c) \ |
| 313 | { \ | 313 | { \ |
| 314 | build_insn(buf, insn##op, c, a, b); \ | 314 | build_insn(buf, insn##op, c, a, b); \ |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | #define I_u2u1s3(op) \ | 317 | #define I_u2u1s3(op) \ |
| 318 | static inline void i##op(u32 **buf, unsigned int a, \ | 318 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 319 | unsigned int b, signed int c) \ | 319 | unsigned int b, signed int c) \ |
| 320 | { \ | 320 | { \ |
| 321 | build_insn(buf, insn##op, b, a, c); \ | 321 | build_insn(buf, insn##op, b, a, c); \ |
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | #define I_u1u2(op) \ | 324 | #define I_u1u2(op) \ |
| 325 | static inline void i##op(u32 **buf, unsigned int a, \ | 325 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 326 | unsigned int b) \ | 326 | unsigned int b) \ |
| 327 | { \ | 327 | { \ |
| 328 | build_insn(buf, insn##op, a, b); \ | 328 | build_insn(buf, insn##op, a, b); \ |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | #define I_u1s2(op) \ | 331 | #define I_u1s2(op) \ |
| 332 | static inline void i##op(u32 **buf, unsigned int a, \ | 332 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
| 333 | signed int b) \ | 333 | signed int b) \ |
| 334 | { \ | 334 | { \ |
| 335 | build_insn(buf, insn##op, a, b); \ | 335 | build_insn(buf, insn##op, a, b); \ |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | #define I_u1(op) \ | 338 | #define I_u1(op) \ |
| 339 | static inline void i##op(u32 **buf, unsigned int a) \ | 339 | static inline void __init i##op(u32 **buf, unsigned int a) \ |
| 340 | { \ | 340 | { \ |
| 341 | build_insn(buf, insn##op, a); \ | 341 | build_insn(buf, insn##op, a); \ |
| 342 | } | 342 | } |
| 343 | 343 | ||
| 344 | #define I_0(op) \ | 344 | #define I_0(op) \ |
| 345 | static inline void i##op(u32 **buf) \ | 345 | static inline void __init i##op(u32 **buf) \ |
| 346 | { \ | 346 | { \ |
| 347 | build_insn(buf, insn##op); \ | 347 | build_insn(buf, insn##op); \ |
| 348 | } | 348 | } |
| @@ -623,42 +623,42 @@ static __init int __attribute__((unused)) insn_has_bdelay(struct reloc *rel, | |||
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | /* convenience functions for labeled branches */ | 625 | /* convenience functions for labeled branches */ |
| 626 | static void __attribute__((unused)) il_bltz(u32 **p, struct reloc **r, | 626 | static void __init __attribute__((unused)) |
| 627 | unsigned int reg, enum label_id l) | 627 | il_bltz(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) |
| 628 | { | 628 | { |
| 629 | r_mips_pc16(r, *p, l); | 629 | r_mips_pc16(r, *p, l); |
| 630 | i_bltz(p, reg, 0); | 630 | i_bltz(p, reg, 0); |
| 631 | } | 631 | } |
| 632 | 632 | ||
| 633 | static void __attribute__((unused)) il_b(u32 **p, struct reloc **r, | 633 | static void __init __attribute__((unused)) il_b(u32 **p, struct reloc **r, |
| 634 | enum label_id l) | 634 | enum label_id l) |
| 635 | { | 635 | { |
| 636 | r_mips_pc16(r, *p, l); | 636 | r_mips_pc16(r, *p, l); |
| 637 | i_b(p, 0); | 637 | i_b(p, 0); |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | static void il_beqz(u32 **p, struct reloc **r, unsigned int reg, | 640 | static void __init il_beqz(u32 **p, struct reloc **r, unsigned int reg, |
| 641 | enum label_id l) | 641 | enum label_id l) |
| 642 | { | 642 | { |
| 643 | r_mips_pc16(r, *p, l); | 643 | r_mips_pc16(r, *p, l); |
| 644 | i_beqz(p, reg, 0); | 644 | i_beqz(p, reg, 0); |
| 645 | } | 645 | } |
| 646 | 646 | ||
| 647 | static void __attribute__((unused)) | 647 | static void __init __attribute__((unused)) |
| 648 | il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) | 648 | il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) |
| 649 | { | 649 | { |
| 650 | r_mips_pc16(r, *p, l); | 650 | r_mips_pc16(r, *p, l); |
| 651 | i_beqzl(p, reg, 0); | 651 | i_beqzl(p, reg, 0); |
| 652 | } | 652 | } |
| 653 | 653 | ||
| 654 | static void il_bnez(u32 **p, struct reloc **r, unsigned int reg, | 654 | static void __init il_bnez(u32 **p, struct reloc **r, unsigned int reg, |
| 655 | enum label_id l) | 655 | enum label_id l) |
| 656 | { | 656 | { |
| 657 | r_mips_pc16(r, *p, l); | 657 | r_mips_pc16(r, *p, l); |
| 658 | i_bnez(p, reg, 0); | 658 | i_bnez(p, reg, 0); |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | static void il_bgezl(u32 **p, struct reloc **r, unsigned int reg, | 661 | static void __init il_bgezl(u32 **p, struct reloc **r, unsigned int reg, |
| 662 | enum label_id l) | 662 | enum label_id l) |
| 663 | { | 663 | { |
| 664 | r_mips_pc16(r, *p, l); | 664 | r_mips_pc16(r, *p, l); |
diff --git a/arch/mips/momentum/jaguar_atx/prom.c b/arch/mips/momentum/jaguar_atx/prom.c index aae7a802767a..1cadaa92946a 100644 --- a/arch/mips/momentum/jaguar_atx/prom.c +++ b/arch/mips/momentum/jaguar_atx/prom.c | |||
| @@ -21,10 +21,10 @@ | |||
| 21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/bootmem.h> | 23 | #include <linux/bootmem.h> |
| 24 | #include <linux/mv643xx.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/addrspace.h> | 26 | #include <asm/addrspace.h> |
| 26 | #include <asm/bootinfo.h> | 27 | #include <asm/bootinfo.h> |
| 27 | #include <asm/mv64340.h> | ||
| 28 | #include <asm/pmon.h> | 28 | #include <asm/pmon.h> |
| 29 | 29 | ||
| 30 | #include "jaguar_atx_fpga.h" | 30 | #include "jaguar_atx_fpga.h" |
diff --git a/arch/mips/momentum/jaguar_atx/setup.c b/arch/mips/momentum/jaguar_atx/setup.c index 301d67226d72..2699917b640a 100644 --- a/arch/mips/momentum/jaguar_atx/setup.c +++ b/arch/mips/momentum/jaguar_atx/setup.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * BRIEF MODULE DESCRIPTION | 2 | * BRIEF MODULE DESCRIPTION |
| 3 | * Momentum Computer Jaguar-ATX board dependent boot routines | 3 | * Momentum Computer Jaguar-ATX board dependent boot routines |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 1996, 1997, 2001, 2004 Ralf Baechle (ralf@linux-mips.org) | 5 | * Copyright (C) 1996, 1997, 2001, 04, 06 Ralf Baechle (ralf@linux-mips.org) |
| 6 | * Copyright (C) 2000 RidgeRun, Inc. | 6 | * Copyright (C) 2000 RidgeRun, Inc. |
| 7 | * Copyright (C) 2001 Red Hat, Inc. | 7 | * Copyright (C) 2001 Red Hat, Inc. |
| 8 | * Copyright (C) 2002 Momentum Computer | 8 | * Copyright (C) 2002 Momentum Computer |
| @@ -55,6 +55,8 @@ | |||
| 55 | #include <linux/interrupt.h> | 55 | #include <linux/interrupt.h> |
| 56 | #include <linux/timex.h> | 56 | #include <linux/timex.h> |
| 57 | #include <linux/vmalloc.h> | 57 | #include <linux/vmalloc.h> |
| 58 | #include <linux/mv643xx.h> | ||
| 59 | |||
| 58 | #include <asm/time.h> | 60 | #include <asm/time.h> |
| 59 | #include <asm/bootinfo.h> | 61 | #include <asm/bootinfo.h> |
| 60 | #include <asm/page.h> | 62 | #include <asm/page.h> |
| @@ -64,7 +66,6 @@ | |||
| 64 | #include <asm/ptrace.h> | 66 | #include <asm/ptrace.h> |
| 65 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
| 66 | #include <asm/tlbflush.h> | 68 | #include <asm/tlbflush.h> |
| 67 | #include <asm/mv64340.h> | ||
| 68 | 69 | ||
| 69 | #include "jaguar_atx_fpga.h" | 70 | #include "jaguar_atx_fpga.h" |
| 70 | 71 | ||
diff --git a/arch/mips/momentum/ocelot_c/irq.c b/arch/mips/momentum/ocelot_c/irq.c index 300fe8e4fbe8..a5764bc20e36 100644 --- a/arch/mips/momentum/ocelot_c/irq.c +++ b/arch/mips/momentum/ocelot_c/irq.c | |||
| @@ -41,11 +41,11 @@ | |||
| 41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
| 42 | #include <linux/random.h> | 42 | #include <linux/random.h> |
| 43 | #include <linux/bitops.h> | 43 | #include <linux/bitops.h> |
| 44 | #include <linux/mv643xx.h> | ||
| 44 | #include <asm/bootinfo.h> | 45 | #include <asm/bootinfo.h> |
| 45 | #include <asm/io.h> | 46 | #include <asm/io.h> |
| 46 | #include <asm/irq_cpu.h> | 47 | #include <asm/irq_cpu.h> |
| 47 | #include <asm/mipsregs.h> | 48 | #include <asm/mipsregs.h> |
| 48 | #include <asm/mv64340.h> | ||
| 49 | #include <asm/system.h> | 49 | #include <asm/system.h> |
| 50 | 50 | ||
| 51 | extern asmlinkage void ocelot_handle_int(void); | 51 | extern asmlinkage void ocelot_handle_int(void); |
diff --git a/arch/mips/momentum/ocelot_c/prom.c b/arch/mips/momentum/ocelot_c/prom.c index 5b6809724b15..e92364482c7b 100644 --- a/arch/mips/momentum/ocelot_c/prom.c +++ b/arch/mips/momentum/ocelot_c/prom.c | |||
| @@ -19,10 +19,10 @@ | |||
| 19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
| 20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
| 21 | #include <linux/bootmem.h> | 21 | #include <linux/bootmem.h> |
| 22 | #include <linux/mv643xx.h> | ||
| 22 | 23 | ||
| 23 | #include <asm/addrspace.h> | 24 | #include <asm/addrspace.h> |
| 24 | #include <asm/bootinfo.h> | 25 | #include <asm/bootinfo.h> |
| 25 | #include <asm/mv64340.h> | ||
| 26 | #include <asm/pmon.h> | 26 | #include <asm/pmon.h> |
| 27 | 27 | ||
| 28 | #include "ocelot_c_fpga.h" | 28 | #include "ocelot_c_fpga.h" |
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c index 15998d8a9341..bd02e60d037a 100644 --- a/arch/mips/momentum/ocelot_c/setup.c +++ b/arch/mips/momentum/ocelot_c/setup.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #include <linux/pm.h> | 54 | #include <linux/pm.h> |
| 55 | #include <linux/timex.h> | 55 | #include <linux/timex.h> |
| 56 | #include <linux/vmalloc.h> | 56 | #include <linux/vmalloc.h> |
| 57 | #include <linux/mv643xx.h> | ||
| 57 | 58 | ||
| 58 | #include <asm/time.h> | 59 | #include <asm/time.h> |
| 59 | #include <asm/bootinfo.h> | 60 | #include <asm/bootinfo.h> |
| @@ -64,9 +65,9 @@ | |||
| 64 | #include <asm/processor.h> | 65 | #include <asm/processor.h> |
| 65 | #include <asm/ptrace.h> | 66 | #include <asm/ptrace.h> |
| 66 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
| 68 | #include <asm/marvell.h> | ||
| 67 | #include <linux/bootmem.h> | 69 | #include <linux/bootmem.h> |
| 68 | #include <linux/blkdev.h> | 70 | #include <linux/blkdev.h> |
| 69 | #include <asm/mv64340.h> | ||
| 70 | #include "ocelot_c_fpga.h" | 71 | #include "ocelot_c_fpga.h" |
| 71 | 72 | ||
| 72 | unsigned long marvell_base; | 73 | unsigned long marvell_base; |
| @@ -252,22 +253,22 @@ void __init plat_setup(void) | |||
| 252 | /* shut down ethernet ports, just to be sure our memory doesn't get | 253 | /* shut down ethernet ports, just to be sure our memory doesn't get |
| 253 | * corrupted by random ethernet traffic. | 254 | * corrupted by random ethernet traffic. |
| 254 | */ | 255 | */ |
| 255 | MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8); | 256 | MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8); |
| 256 | MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8); | 257 | MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8); |
| 257 | MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8); | 258 | MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8); |
| 258 | MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8); | 259 | MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8); |
| 259 | do {} | 260 | do {} |
| 260 | while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff); | 261 | while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff); |
| 261 | do {} | 262 | do {} |
| 262 | while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff); | 263 | while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff); |
| 263 | do {} | 264 | do {} |
| 264 | while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff); | 265 | while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff); |
| 265 | do {} | 266 | do {} |
| 266 | while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff); | 267 | while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff); |
| 267 | MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0), | 268 | MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0), |
| 268 | MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1); | 269 | MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1); |
| 269 | MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1), | 270 | MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1), |
| 270 | MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1); | 271 | MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1); |
| 271 | 272 | ||
| 272 | /* Turn off the Bit-Error LED */ | 273 | /* Turn off the Bit-Error LED */ |
| 273 | OCELOT_FPGA_WRITE(0x80, CLR); | 274 | OCELOT_FPGA_WRITE(0x80, CLR); |
diff --git a/arch/mips/pci/pci-ocelot-c.c b/arch/mips/pci/pci-ocelot-c.c index 1d84d36e034d..027759f7c904 100644 --- a/arch/mips/pci/pci-ocelot-c.c +++ b/arch/mips/pci/pci-ocelot-c.c | |||
| @@ -3,15 +3,17 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | 6 | * Copyright (C) 2004, 06 by Ralf Baechle (ralf@linux-mips.org) |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
| 10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
| 11 | #include <asm/mv64340.h> | 11 | #include <linux/mv643xx.h> |
| 12 | 12 | ||
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | 14 | ||
| 15 | #include <asm/marvell.h> | ||
| 16 | |||
| 15 | /* | 17 | /* |
| 16 | * We assume the address ranges have already been setup appropriately by | 18 | * We assume the address ranges have already been setup appropriately by |
| 17 | * the firmware. PMON in case of the Ocelot C does that. | 19 | * the firmware. PMON in case of the Ocelot C does that. |
diff --git a/arch/mips/sibyte/sb1250/time.c b/arch/mips/sibyte/sb1250/time.c index 511c89d65f38..1588f6debd90 100644 --- a/arch/mips/sibyte/sb1250/time.c +++ b/arch/mips/sibyte/sb1250/time.c | |||
| @@ -47,23 +47,51 @@ | |||
| 47 | #define IMR_IP3_VAL K_INT_MAP_I1 | 47 | #define IMR_IP3_VAL K_INT_MAP_I1 |
| 48 | #define IMR_IP4_VAL K_INT_MAP_I2 | 48 | #define IMR_IP4_VAL K_INT_MAP_I2 |
| 49 | 49 | ||
| 50 | #define SB1250_HPT_NUM 3 | ||
| 51 | #define SB1250_HPT_VALUE M_SCD_TIMER_CNT /* max value */ | ||
| 52 | #define SB1250_HPT_SHIFT ((sizeof(unsigned int)*8)-V_SCD_TIMER_WIDTH) | ||
| 53 | |||
| 54 | |||
| 50 | extern int sb1250_steal_irq(int irq); | 55 | extern int sb1250_steal_irq(int irq); |
| 51 | 56 | ||
| 57 | static unsigned int sb1250_hpt_read(void); | ||
| 58 | static void sb1250_hpt_init(unsigned int); | ||
| 59 | |||
| 60 | static unsigned int hpt_offset; | ||
| 61 | |||
| 62 | void __init sb1250_hpt_setup(void) | ||
| 63 | { | ||
| 64 | int cpu = smp_processor_id(); | ||
| 65 | |||
| 66 | if (!cpu) { | ||
| 67 | /* Setup hpt using timer #3 but do not enable irq for it */ | ||
| 68 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG))); | ||
| 69 | __raw_writeq(SB1250_HPT_VALUE, | ||
| 70 | IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_INIT))); | ||
| 71 | __raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | ||
| 72 | IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG))); | ||
| 73 | |||
| 74 | /* | ||
| 75 | * we need to fill 32 bits, so just use the upper 23 bits and pretend | ||
| 76 | * the timer is going 512Mhz instead of 1Mhz | ||
| 77 | */ | ||
| 78 | mips_hpt_frequency = V_SCD_TIMER_FREQ << SB1250_HPT_SHIFT; | ||
| 79 | mips_hpt_init = sb1250_hpt_init; | ||
| 80 | mips_hpt_read = sb1250_hpt_read; | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | |||
| 52 | void sb1250_time_init(void) | 85 | void sb1250_time_init(void) |
| 53 | { | 86 | { |
| 54 | int cpu = smp_processor_id(); | 87 | int cpu = smp_processor_id(); |
| 55 | int irq = K_INT_TIMER_0+cpu; | 88 | int irq = K_INT_TIMER_0+cpu; |
| 56 | 89 | ||
| 57 | /* Only have 4 general purpose timers */ | 90 | /* Only have 4 general purpose timers, and we use last one as hpt */ |
| 58 | if (cpu > 3) { | 91 | if (cpu > 2) { |
| 59 | BUG(); | 92 | BUG(); |
| 60 | } | 93 | } |
| 61 | 94 | ||
| 62 | if (!cpu) { | ||
| 63 | /* Use our own gettimeoffset() routine */ | ||
| 64 | do_gettimeoffset = sb1250_gettimeoffset; | ||
| 65 | } | ||
| 66 | |||
| 67 | sb1250_mask_irq(cpu, irq); | 95 | sb1250_mask_irq(cpu, irq); |
| 68 | 96 | ||
| 69 | /* Map the timer interrupt to ip[4] of this cpu */ | 97 | /* Map the timer interrupt to ip[4] of this cpu */ |
| @@ -75,10 +103,10 @@ void sb1250_time_init(void) | |||
| 75 | /* Disable the timer and set up the count */ | 103 | /* Disable the timer and set up the count */ |
| 76 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 104 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
| 77 | #ifdef CONFIG_SIMULATION | 105 | #ifdef CONFIG_SIMULATION |
| 78 | __raw_writeq(50000 / HZ, | 106 | __raw_writeq((50000 / HZ) - 1, |
| 79 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); | 107 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); |
| 80 | #else | 108 | #else |
| 81 | __raw_writeq(1000000 / HZ, | 109 | __raw_writeq((V_SCD_TIMER_FREQ / HZ) - 1, |
| 82 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); | 110 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); |
| 83 | #endif | 111 | #endif |
| 84 | 112 | ||
| @@ -103,7 +131,7 @@ void sb1250_timer_interrupt(struct pt_regs *regs) | |||
| 103 | int cpu = smp_processor_id(); | 131 | int cpu = smp_processor_id(); |
| 104 | int irq = K_INT_TIMER_0 + cpu; | 132 | int irq = K_INT_TIMER_0 + cpu; |
| 105 | 133 | ||
| 106 | /* Reset the timer */ | 134 | /* ACK interrupt */ |
| 107 | ____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | 135 | ____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, |
| 108 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 136 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
| 109 | 137 | ||
| @@ -122,15 +150,26 @@ void sb1250_timer_interrupt(struct pt_regs *regs) | |||
| 122 | } | 150 | } |
| 123 | 151 | ||
| 124 | /* | 152 | /* |
| 125 | * We use our own do_gettimeoffset() instead of the generic one, | 153 | * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over |
| 126 | * because the generic one does not work for SMP case. | 154 | * again. There's no easy way to set to a specific value so store init value |
| 127 | * In addition, since we use general timer 0 for system time, | 155 | * in hpt_offset and subtract each time. |
| 128 | * we can get accurate intra-jiffy offset without calibration. | 156 | * |
| 157 | * Note: Timer isn't full 32bits so shift it into the upper part making | ||
| 158 | * it appear to run at a higher frequency. | ||
| 129 | */ | 159 | */ |
| 130 | unsigned long sb1250_gettimeoffset(void) | 160 | static unsigned int sb1250_hpt_read(void) |
| 131 | { | 161 | { |
| 132 | unsigned long count = | 162 | unsigned int count; |
| 133 | __raw_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT))); | ||
| 134 | 163 | ||
| 135 | return 1000000/HZ - count; | 164 | count = G_SCD_TIMER_CNT(__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CNT)))); |
| 136 | } | 165 | |
| 166 | count = (SB1250_HPT_VALUE - count) << SB1250_HPT_SHIFT; | ||
| 167 | |||
| 168 | return count - hpt_offset; | ||
| 169 | } | ||
| 170 | |||
| 171 | static void sb1250_hpt_init(unsigned int count) | ||
| 172 | { | ||
| 173 | hpt_offset = count; | ||
| 174 | return; | ||
| 175 | } | ||
diff --git a/arch/mips/sibyte/swarm/setup.c b/arch/mips/sibyte/swarm/setup.c index b614ca0ddb69..b661d2425a36 100644 --- a/arch/mips/sibyte/swarm/setup.c +++ b/arch/mips/sibyte/swarm/setup.c | |||
| @@ -70,6 +70,12 @@ const char *get_system_type(void) | |||
| 70 | return "SiByte " SIBYTE_BOARD_NAME; | 70 | return "SiByte " SIBYTE_BOARD_NAME; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | void __init swarm_time_init(void) | ||
| 74 | { | ||
| 75 | /* Setup HPT */ | ||
| 76 | sb1250_hpt_setup(); | ||
| 77 | } | ||
| 78 | |||
| 73 | void __init swarm_timer_setup(struct irqaction *irq) | 79 | void __init swarm_timer_setup(struct irqaction *irq) |
| 74 | { | 80 | { |
| 75 | /* | 81 | /* |
| @@ -109,6 +115,7 @@ void __init plat_setup(void) | |||
| 109 | 115 | ||
| 110 | panic_timeout = 5; /* For debug. */ | 116 | panic_timeout = 5; /* For debug. */ |
| 111 | 117 | ||
| 118 | board_time_init = swarm_time_init; | ||
| 112 | board_timer_setup = swarm_timer_setup; | 119 | board_timer_setup = swarm_timer_setup; |
| 113 | board_be_handler = swarm_be_handler; | 120 | board_be_handler = swarm_be_handler; |
| 114 | 121 | ||
