My only comment about this is:
Aren't there more processors that have sync? I thought the RM7000
(PMC-Sierra) did too...
Matt
--
Matthew D. Dharm Senior Software Designer
Momentum Computer Inc. 1815 Aston Ave. Suite 107
(760) 431-8663 X-115 Carlsbad, CA 92008-7310
Momentum Works For You www.momenco.com
> -----Original Message-----
> From: owner-linux-mips@oss.sgi.com
> [mailto:owner-linux-mips@oss.sgi.com]On Behalf Of Maciej W. Rozycki
> Sent: Monday, February 11, 2002 7:46 AM
> To: Ralf Baechle
> Cc: linux-mips@fnet.fr; linux-mips@oss.sgi.com
> Subject: [patch] linux 2.4.17: The second mb() rework (final)
>
>
> Ralf,
>
> I haven't seen any objections. Could you please apply it?
>
> Maciej
>
> --
> + Maciej W. Rozycki, Technical University of Gdansk, Poland +
> +--------------------------------------------------------------+
> + e-mail: macro@ds2.pg.gda.pl, PGP key available +
>
> patch-mips-2.4.17-20020129-mb-wb-5
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/arch/mips/config.in
> linux-mips-2.4.17-20020129/arch/mips/config.in
> --- linux-mips-2.4.17-20020129.macro/arch/mips/config.in
> Fri Jan 25 05:26:34 2002
> +++ linux-mips-2.4.17-20020129/arch/mips/config.in Mon
> Feb 4 00:07:13 2002
> @@ -384,6 +384,12 @@ else
> fi
> fi
> fi
> +if [ "$CONFIG_CPU_R3000" = "y" -o \
> + "$CONFIG_CPU_TX39XX" = "y" ]; then
> + define_bool CONFIG_CPU_HAS_SYNC n
> +else
> + define_bool CONFIG_CPU_HAS_SYNC y
> +fi
> endmenu
>
> mainmenu_option next_comment
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips/system.h
> linux-mips-2.4.17-20020129/include/asm-mips/system.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips/system.h
> Sun Jan 27 05:27:59 2002
> +++ linux-mips-2.4.17-20020129/include/asm-mips/system.h
> Mon Feb 4 02:10:33 2002
> @@ -18,9 +18,12 @@
>
> #include <linux/config.h>
> #include <asm/sgidefs.h>
> -#include <asm/ptrace.h>
> +
> #include <linux/kernel.h>
>
> +#include <asm/addrspace.h>
> +#include <asm/ptrace.h>
> +
> __asm__ (
> ".macro\t__sti\n\t"
> ".set\tpush\n\t"
> @@ -166,32 +169,57 @@ extern void __global_restore_flags(unsig
> #define local_irq_disable() __cli();
> #define local_irq_enable() __sti();
>
> -/*
> - * These are probably defined overly paranoid ...
> - */
> +#ifdef CONFIG_CPU_HAS_SYNC
> +#define __sync() \
> + __asm__ __volatile__( \
> + ".set push\n\t" \
> + ".set noreorder\n\t" \
> + "sync\n\t" \
> + ".set pop" \
> + : /* no output */ \
> + : /* no input */ \
> + : "memory")
> +#else
> +#define __sync() do { } while(0)
> +#endif
> +
> +#define __fast_iob() \
> + __asm__ __volatile__( \
> + ".set push\n\t" \
> + ".set noreorder\n\t" \
> + "lw $0,%0\n\t" \
> + "nop\n\t" \
> + ".set pop" \
> + : /* no output */ \
> + : "m" (*(int *)KSEG1) \
> + : "memory")
> +
> +#define fast_wmb() __sync()
> +#define fast_rmb() __sync()
> +#define fast_mb() __sync()
> +#define fast_iob() \
> + do { \
> + __sync(); \
> + __fast_iob(); \
> + } while (0)
> +
> #ifdef CONFIG_CPU_HAS_WB
>
> #include <asm/wbflush.h>
> -#define rmb() do { } while(0)
> -#define wmb() wbflush()
> -#define mb() wbflush()
> -
> -#else /* CONFIG_CPU_HAS_WB */
> -
> -#define mb() \
> -__asm__ __volatile__( \
> - "# prevent instructions being moved around\n\t" \
> - ".set\tnoreorder\n\t" \
> - "# 8 nops to fool the R4400 pipeline\n\t" \
> - "nop;nop;nop;nop;nop;nop;nop;nop\n\t" \
> - ".set\treorder" \
> - : /* no output */ \
> - : /* no input */ \
> - : "memory")
> -#define rmb() mb()
> -#define wmb() mb()
>
> -#endif /* CONFIG_CPU_HAS_WB */
> +#define wmb() fast_wmb()
> +#define rmb() fast_rmb()
> +#define mb() wbflush();
> +#define iob() wbflush();
> +
> +#else /* !CONFIG_CPU_HAS_WB */
> +
> +#define wmb() fast_wmb()
> +#define rmb() fast_rmb()
> +#define mb() fast_mb()
> +#define iob() fast_iob()
> +
> +#endif /* !CONFIG_CPU_HAS_WB */
>
> #ifdef CONFIG_SMP
> #define smp_mb() mb()
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips/wbflush.h
> linux-mips-2.4.17-20020129/include/asm-mips/wbflush.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips/wbflush.h
> Fri Sep 7 04:26:33 2001
> +++ linux-mips-2.4.17-20020129/include/asm-mips/wbflush.h
> Mon Feb 4 02:52:11 2002
> @@ -6,29 +6,30 @@
> * for more details.
> *
> * Copyright (c) 1998 Harald Koerfgen
> + * Copyright (C) 2002 Maciej W. Rozycki
> */
> #ifndef __ASM_MIPS_WBFLUSH_H
> #define __ASM_MIPS_WBFLUSH_H
>
> #include <linux/config.h>
>
> -#if defined(CONFIG_CPU_HAS_WB)
> -/*
> - * R2000 or R3000
> - */
> -extern void (*__wbflush) (void);
> +#ifdef CONFIG_CPU_HAS_WB
>
> -#define wbflush() __wbflush()
> +extern void (*__wbflush)(void);
> +extern void wbflush_setup(void);
>
> -#else
> -/*
> - * we don't need no stinkin' wbflush
> - */
> +#define wbflush() \
> + do { \
> + __sync(); \
> + __wbflush(); \
> + } while (0)
>
> -#define wbflush() do { } while(0)
> +#else /* !CONFIG_CPU_HAS_WB */
>
> -#endif
> +#define wbflush_setup() do { } while (0)
>
> -extern void wbflush_setup(void);
> +#define wbflush() fast_iob()
> +
> +#endif /* !CONFIG_CPU_HAS_WB */
>
> #endif /* __ASM_MIPS_WBFLUSH_H */
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips64/system.h
> linux-mips-2.4.17-20020129/include/asm-mips64/system.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips64/system.
> h Sun Jan 27 05:27:59 2002
> +++ linux-mips-2.4.17-20020129/include/asm-mips64/system.h
> Mon Feb 4 02:12:27 2002
> @@ -11,12 +11,13 @@
> #define _ASM_SYSTEM_H
>
> #include <linux/config.h>
> -
> #include <asm/sgidefs.h>
> -#include <asm/ptrace.h>
>
> #include <linux/kernel.h>
>
> +#include <asm/addrspace.h>
> +#include <asm/ptrace.h>
> +
> __asm__ (
> ".macro\t__sti\n\t"
> ".set\tpush\n\t"
> @@ -163,20 +164,32 @@ extern void __global_restore_flags(unsig
> #define local_irq_disable() __cli();
> #define local_irq_enable() __sti();
>
> -/*
> - * These are probably defined overly paranoid ...
> - */
> -#define mb() \
> -__asm__ __volatile__( \
> - "# prevent instructions being moved around\n\t" \
> - ".set\tnoreorder\n\t" \
> - "sync\n\t" \
> - ".set\treorder" \
> - : /* no output */ \
> - : /* no input */ \
> - : "memory")
> -#define rmb() mb()
> -#define wmb() mb()
> +#define __sync() \
> + __asm__ __volatile__( \
> + ".set push\n\t" \
> + ".set noreorder\n\t" \
> + "sync\n\t" \
> + ".set pop" \
> + : /* no output */ \
> + : /* no input */ \
> + : "memory")
> +
> +#define wmb() __sync()
> +#define rmb() __sync()
> +#define mb() __sync()
> +#define iob() \
> + do { \
> + __sync(); \
> + __asm__ __volatile__( \
> + ".set push\n\t" \
> + ".set noreorder\n\t" \
> + "lw $0,%0\n\t" \
> + "nop\n\t" \
> + ".set pop" \
> + : /* no output */ \
> + : "m" (*(int *)KSEG1) \
> + : "memory"); \
> + } while (0)
>
> #ifdef CONFIG_SMP
> #define smp_mb() mb()
>
|