mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 19:01:37 +00:00
368dd5acd1
Implement the Panasonic MN10300 AM34 CPU subarch and implement SMP support for MN10300. Also implement support for the MN2WS0060 processor and the ASB2364 evaluation board which are AM34 based. Signed-off-by: Akira Takeuchi <takeuchi.akr@jp.panasonic.com> Signed-off-by: Kiyoshi Owada <owada.kiyoshi@jp.panasonic.com> Signed-off-by: David Howells <dhowells@redhat.com>
126 lines
3.0 KiB
C
126 lines
3.0 KiB
C
/*
|
|
* Helpers used by both rw spinlocks and rw semaphores.
|
|
*
|
|
* Based in part on code from semaphore.h and
|
|
* spinlock.h Copyright 1996 Linus Torvalds.
|
|
*
|
|
* Copyright 1999 Red Hat, Inc.
|
|
*
|
|
* Written by Benjamin LaHaise.
|
|
*
|
|
* Modified by Matsushita Electric Industrial Co., Ltd.
|
|
* Modifications:
|
|
* 13-Nov-2006 MEI Temporarily delete lock functions for SMP support.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*/
|
|
#ifndef _ASM_RWLOCK_H
|
|
#define _ASM_RWLOCK_H
|
|
|
|
#define RW_LOCK_BIAS 0x01000000
|
|
|
|
#ifndef CONFIG_SMP
|
|
|
|
typedef struct { unsigned long a[100]; } __dummy_lock_t;
|
|
#define __dummy_lock(lock) (*(__dummy_lock_t *)(lock))
|
|
|
|
#define RW_LOCK_BIAS_STR "0x01000000"
|
|
|
|
#define __build_read_lock_ptr(rw, helper) \
|
|
do { \
|
|
asm volatile( \
|
|
" mov (%0),d3 \n" \
|
|
" sub 1,d3 \n" \
|
|
" mov d3,(%0) \n" \
|
|
" blt 1f \n" \
|
|
" bra 2f \n" \
|
|
"1: jmp 3f \n" \
|
|
"2: \n" \
|
|
" .section .text.lock,\"ax\" \n" \
|
|
"3: call "helper"[],0 \n" \
|
|
" jmp 2b \n" \
|
|
" .previous" \
|
|
: \
|
|
: "d" (rw) \
|
|
: "memory", "d3", "cc"); \
|
|
} while (0)
|
|
|
|
#define __build_read_lock_const(rw, helper) \
|
|
do { \
|
|
asm volatile( \
|
|
" mov (%0),d3 \n" \
|
|
" sub 1,d3 \n" \
|
|
" mov d3,(%0) \n" \
|
|
" blt 1f \n" \
|
|
" bra 2f \n" \
|
|
"1: jmp 3f \n" \
|
|
"2: \n" \
|
|
" .section .text.lock,\"ax\" \n" \
|
|
"3: call "helper"[],0 \n" \
|
|
" jmp 2b \n" \
|
|
" .previous" \
|
|
: \
|
|
: "d" (rw) \
|
|
: "memory", "d3", "cc"); \
|
|
} while (0)
|
|
|
|
#define __build_read_lock(rw, helper) \
|
|
do { \
|
|
if (__builtin_constant_p(rw)) \
|
|
__build_read_lock_const(rw, helper); \
|
|
else \
|
|
__build_read_lock_ptr(rw, helper); \
|
|
} while (0)
|
|
|
|
#define __build_write_lock_ptr(rw, helper) \
|
|
do { \
|
|
asm volatile( \
|
|
" mov (%0),d3 \n" \
|
|
" sub 1,d3 \n" \
|
|
" mov d3,(%0) \n" \
|
|
" blt 1f \n" \
|
|
" bra 2f \n" \
|
|
"1: jmp 3f \n" \
|
|
"2: \n" \
|
|
" .section .text.lock,\"ax\" \n" \
|
|
"3: call "helper"[],0 \n" \
|
|
" jmp 2b \n" \
|
|
" .previous" \
|
|
: \
|
|
: "d" (rw) \
|
|
: "memory", "d3", "cc"); \
|
|
} while (0)
|
|
|
|
#define __build_write_lock_const(rw, helper) \
|
|
do { \
|
|
asm volatile( \
|
|
" mov (%0),d3 \n" \
|
|
" sub 1,d3 \n" \
|
|
" mov d3,(%0) \n" \
|
|
" blt 1f \n" \
|
|
" bra 2f \n" \
|
|
"1: jmp 3f \n" \
|
|
"2: \n" \
|
|
" .section .text.lock,\"ax\" \n" \
|
|
"3: call "helper"[],0 \n" \
|
|
" jmp 2b \n" \
|
|
" .previous" \
|
|
: \
|
|
: "d" (rw) \
|
|
: "memory", "d3", "cc"); \
|
|
} while (0)
|
|
|
|
#define __build_write_lock(rw, helper) \
|
|
do { \
|
|
if (__builtin_constant_p(rw)) \
|
|
__build_write_lock_const(rw, helper); \
|
|
else \
|
|
__build_write_lock_ptr(rw, helper); \
|
|
} while (0)
|
|
|
|
#endif /* CONFIG_SMP */
|
|
#endif /* _ASM_RWLOCK_H */
|