summaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-06-03 09:23:20 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-06-03 09:23:20 +0000
commitac5ff8f4a72f7b4e66f73c3c6cb9fe7758cf6f12 (patch)
tree9fc7f8ce32e0d9a4aa055b2a58a05a5d727b333c /arch/sparc
parent52662ff3e66770fd7e4fc508c91056d29c08bff0 (diff)
Sync with Linux 2.1.42.
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/kernel/setup.c3
-rw-r--r--arch/sparc/lib/blockops.S17
-rw-r--r--arch/sparc/mm/hypersparc.S52
-rw-r--r--arch/sparc/mm/srmmu.c13
-rw-r--r--arch/sparc/prom/memory.c9
5 files changed, 61 insertions, 33 deletions
diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
index aa204db06..a6b3f9e07 100644
--- a/arch/sparc/kernel/setup.c
+++ b/arch/sparc/kernel/setup.c
@@ -1,4 +1,4 @@
-/* $Id: setup.c,v 1.84 1997/05/08 17:45:16 davem Exp $
+/* $Id: setup.c,v 1.85 1997/05/27 06:45:54 davem Exp $
* linux/arch/sparc/kernel/setup.c
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -79,7 +79,6 @@ asmlinkage void sys_sync(void); /* it's really int */
void prom_sync_me(void)
{
unsigned long prom_tbr, flags;
- int cpu = smp_processor_id();
#ifdef __SMP__
global_irq_holder = NO_PROC_ID;
diff --git a/arch/sparc/lib/blockops.S b/arch/sparc/lib/blockops.S
index c11ab1b20..a5a4bffad 100644
--- a/arch/sparc/lib/blockops.S
+++ b/arch/sparc/lib/blockops.S
@@ -1,4 +1,4 @@
-/* $Id: blockops.S,v 1.6 1997/05/03 02:01:54 davem Exp $
+/* $Id: blockops.S,v 1.7 1997/05/20 07:58:28 jj Exp $
* blockops.S: Common block zero optimized routines.
*
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -45,8 +45,11 @@
.text
.align 4
+ .globl C_LABEL(bzero_1page), C_LABEL(__copy_1page)
-generic_bzero_1page:
+C_LABEL(bzero_1page):
+/* NOTE: If you change the number of insns of this routine, please check
+ * arch/sparc/mm/hypersparc.S */
/* %o0 = buf */
or %g0, %g0, %g1
or %o0, %g0, %o1
@@ -63,7 +66,9 @@ generic_bzero_1page:
retl
nop
-__generic_copy_1page:
+C_LABEL(__copy_1page):
+/* NOTE: If you change the number of insns of this routine, please check
+ * arch/sparc/mm/hypersparc.S */
/* %o0 = dst, %o1 = src */
or %g0, 0x10, %g1
1:
@@ -82,9 +87,3 @@ __generic_copy_1page:
retl
nop
-
- .data
- .align 4
- .globl C_LABEL(bzero_1page), C_LABEL(__copy_1page)
-C_LABEL(bzero_1page): .word generic_bzero_1page
-C_LABEL(__copy_1page): .word __generic_copy_1page
diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S
index 62e2022e0..e6ba7b235 100644
--- a/arch/sparc/mm/hypersparc.S
+++ b/arch/sparc/mm/hypersparc.S
@@ -1,4 +1,4 @@
-/* $Id: hypersparc.S,v 1.7 1997/05/03 05:09:12 davem Exp $
+/* $Id: hypersparc.S,v 1.10 1997/05/27 19:29:58 jj Exp $
* hypersparc.S: High speed Hypersparc mmu/cache operations.
*
* Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -9,6 +9,7 @@
#include <asm/asi.h>
#include <asm/page.h>
#include <asm/pgtsrmmu.h>
+#include <linux/init.h>
#define WINDOW_FLUSH(tmp1, tmp2) \
mov 0, tmp1; \
@@ -335,17 +336,19 @@ hypersparc_flush_tlb_page_out:
retl
sta %g5, [%g1] ASI_M_MMUREGS
+ __INIT
+
/* High speed page clear/copy. */
- .globl hypersparc_bzero_1page, hypersparc_copy_1page
hypersparc_bzero_1page:
+/* NOTE: This routine has to be shorter than 40insns --jj */
clr %g1
mov 32, %g2
- add %g2, %g2, %g3
- add %g2, %g3, %g4
- add %g2, %g4, %g5
- add %g2, %g5, %g7
- add %g2, %g7, %o2
- add %g2, %o2, %o3
+ mov 64, %g3
+ mov 96, %g4
+ mov 128, %g5
+ mov 160, %g7
+ mov 192, %o2
+ mov 224, %o3
mov 16, %o1
1:
stda %g0, [%o0 + %g0] ASI_M_BFILL
@@ -364,6 +367,7 @@ hypersparc_bzero_1page:
nop
hypersparc_copy_1page:
+/* NOTE: This routine has to be shorter than 70insns --jj */
sub %o1, %o0, %o2 ! difference
mov 16, %g1
1:
@@ -388,3 +392,35 @@ hypersparc_copy_1page:
retl
nop
+
+ .globl hypersparc_setup_blockops
+hypersparc_setup_blockops:
+ sethi %hi(bzero_1page), %o0
+ or %o0, %lo(bzero_1page), %o0
+ sethi %hi(hypersparc_bzero_1page), %o1
+ or %o1, %lo(hypersparc_bzero_1page), %o1
+ sethi %hi(hypersparc_copy_1page), %o2
+ or %o2, %lo(hypersparc_copy_1page), %o2
+ ld [%o1], %o4
+1:
+ add %o1, 4, %o1
+ st %o4, [%o0]
+ add %o0, 4, %o0
+ cmp %o1, %o2
+ bne 1b
+ ld [%o1], %o4
+ sethi %hi(__copy_1page), %o0
+ or %o0, %lo(__copy_1page), %o0
+ sethi %hi(hypersparc_setup_blockops), %o2
+ or %o2, %lo(hypersparc_setup_blockops), %o2
+ ld [%o1], %o4
+1:
+ add %o1, 4, %o1
+ st %o4, [%o0]
+ add %o0, 4, %o0
+ cmp %o1, %o2
+ bne 1b
+ ld [%o1], %o4
+ sta %g0, [%g0] ASI_M_FLUSH_IWHOLE
+ retl
+ nop
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
index b04064efb..7420b98cb 100644
--- a/arch/sparc/mm/srmmu.c
+++ b/arch/sparc/mm/srmmu.c
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.146 1997/05/18 21:11:09 davem Exp $
+/* $Id: srmmu.c,v 1.147 1997/05/20 07:58:42 jj Exp $
* srmmu.c: SRMMU specific routines for memory management.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -1239,8 +1239,7 @@ extern void hypersparc_flush_tlb_all(void);
extern void hypersparc_flush_tlb_mm(struct mm_struct *mm);
extern void hypersparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end);
extern void hypersparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
-extern void hypersparc_bzero_1page(void *);
-extern void hypersparc_copy_1page(void *, const void *);
+extern void hypersparc_setup_blockops(void);
static void srmmu_set_pte_nocache_hyper(pte_t *ptep, pte_t pteval)
{
@@ -2411,13 +2410,7 @@ __initfunc(static void init_hypersparc(void))
sparc_update_rootmmu_dir = hypersparc_update_rootmmu_dir;
poke_srmmu = poke_hypersparc;
- /* High performance page copy/clear. */
- { extern void (*__copy_1page)(void *, const void *);
- extern void (*bzero_1page)(void *);
-
- __copy_1page = hypersparc_copy_1page;
- bzero_1page = hypersparc_bzero_1page;
- }
+ hypersparc_setup_blockops();
}
static void poke_cypress(void)
diff --git a/arch/sparc/prom/memory.c b/arch/sparc/prom/memory.c
index e2a809017..b53bd17ea 100644
--- a/arch/sparc/prom/memory.c
+++ b/arch/sparc/prom/memory.c
@@ -1,4 +1,4 @@
-/* $Id: memory.c,v 1.10 1997/03/18 17:58:27 jj Exp $
+/* $Id: memory.c,v 1.12 1997/05/27 06:45:57 davem Exp $
* memory.c: Prom routine for acquiring various bits of information
* about RAM on the machine, both virtual and physical.
*
@@ -116,7 +116,7 @@ __initfunc(void prom_meminit(void))
num_regs = (num_regs/sizeof(struct linux_prom_registers));
for(iter=0; iter<num_regs; iter++) {
prom_phys_avail[iter].start_adr =
- prom_reg_memlist[iter].phys_addr;
+ (char *) prom_reg_memlist[iter].phys_addr;
prom_phys_avail[iter].num_bytes =
(unsigned long) prom_reg_memlist[iter].reg_size;
prom_phys_avail[iter].theres_more =
@@ -130,7 +130,7 @@ __initfunc(void prom_meminit(void))
num_regs = (num_regs/sizeof(struct linux_prom_registers));
for(iter=0; iter<num_regs; iter++) {
prom_phys_total[iter].start_adr =
- prom_reg_memlist[iter].phys_addr;
+ (char *) prom_reg_memlist[iter].phys_addr;
prom_phys_total[iter].num_bytes =
(unsigned long) prom_reg_memlist[iter].reg_size;
prom_phys_total[iter].theres_more =
@@ -150,7 +150,7 @@ __initfunc(void prom_meminit(void))
*/
for(iter=0; iter<num_regs; iter++) {
prom_prom_taken[iter].start_adr =
- prom_reg_memlist[iter].phys_addr;
+ (char *) prom_reg_memlist[iter].phys_addr;
prom_prom_taken[iter].num_bytes =
(unsigned long) prom_reg_memlist[iter].reg_size;
prom_prom_taken[iter].theres_more =
@@ -193,6 +193,7 @@ __initfunc(void prom_meminit(void))
prom_sortmemlist(prom_prom_taken);
prom_sortmemlist(prom_phys_avail);
#endif
+ default:
break;
};