All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Habets <errandir_news@mph.eclipse.co.uk>
To: sparclinux@vger.kernel.org
Subject: Re: [RFT] [SPARC] Emulate cmpxchg like parisc
Date: Sat, 26 May 2007 00:24:40 +0000	[thread overview]
Message-ID: <20070526002440.GA15449@palantir8> (raw)
In-Reply-To: <20070525201143.GB14171@fattire.cabal.ca>

Hi Kyle,

After some minor fixes this builds, and the DRM drivers also
build again. I cannot test this since I do not have a machine with
PCI or these cards.
Removed your name in the comment, as that went out of fashion after
we started using proper versioning systems.

I've got a ppc->sparc32 compiler if that would help...

Thanks,
Martin

	Acked-by: Martin Habets <errandir_news@mph.eclipse.co.uk>

On Fri, May 25, 2007 at 04:11:43PM -0400, Kyle McMartin wrote:
> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
> 
> ---
> 
> PS: Anyone have a nice prebuilt i386->sparc{32,64} xcompiler setup
> I could snag? Would be nice to testbuild these patches before I send
> them out next time.


Index: 2.6.21_drm/arch/sparc/lib/atomic32.c
=================================--- 2.6.21_drm.orig/arch/sparc/lib/atomic32.c	2007-05-23 19:31:00.000000000 +0100
+++ 2.6.21_drm/arch/sparc/lib/atomic32.c	2007-05-26 01:07:09.000000000 +0100
@@ -117,3 +117,17 @@
 	return old & mask;
 }
 EXPORT_SYMBOL(___change_bit);
+
+unsigned long __cmpxchg_u32(volatile u32 *addr, u32 old, u32 new)
+{
+	unsigned long flags;
+	u32 prev;
+
+	spin_lock_irqsave(ATOMIC_HASH(addr), flags);
+	if ((prev = *addr) = old)
+		*addr = new;
+	spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
+
+	return (unsigned long)prev;
+}
+EXPORT_SYMBOL(__cmpxchg_u32);
Index: 2.6.21_drm/include/asm-sparc/atomic.h
=================================--- 2.6.21_drm.orig/include/asm-sparc/atomic.h	2007-05-23 19:31:39.000000000 +0100
+++ 2.6.21_drm/include/asm-sparc/atomic.h	2007-05-26 01:06:37.000000000 +0100
@@ -10,11 +10,48 @@
 #ifndef __ARCH_SPARC_ATOMIC__
 #define __ARCH_SPARC_ATOMIC__
 
+#include <linux/types.h>
 
 typedef struct { volatile int counter; } atomic_t;
 
 #ifdef __KERNEL__
 
+/* Emulate cmpxchg() the same way we emulate atomics,
+ * by hashing the object address and indexing into an array
+ * of spinlocks to get a bit of performance...
+ *
+ * See arch/sparc/lib/atomic32.c for implementation.
+ *
+ * Cribbed from <asm-parisc/atomic.h>
+ */
+#define __HAVE_ARCH_CMPXCHG	1
+
+/* bug catcher for when unsupported size is used - won't link */
+extern void __cmpxchg_called_with_bad_pointer(void);
+/* we only need to support cmpxchg of a u32 on sparc */
+extern unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_);
+
+/* don't worry...optimizer will get rid of most of this */
+static __inline__ unsigned long
+__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)
+{
+	switch(size) {
+	case 4:
+		return __cmpxchg_u32((u32 *)ptr, (u32)old, (u32)new_);
+	default:
+		__cmpxchg_called_with_bad_pointer();
+		break;
+	}
+	return old;
+}
+
+#define cmpxchg(ptr,o,n) ({						\
+	__typeof__(*(ptr)) _o_ = (o);					\
+	__typeof__(*(ptr)) _n_ = (n);					\
+	(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,	\
+			(unsigned long)_n_, sizeof(*(ptr)));		\
+})
+
 #define ATOMIC_INIT(i)  { (i) }
 
 extern int __atomic_add_return(int, atomic_t *);

  reply	other threads:[~2007-05-26  0:24 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-25 20:11 [RFT] [SPARC] Emulate cmpxchg like parisc Kyle McMartin
2007-05-26  0:24 ` Martin Habets [this message]
2007-05-26  5:00 ` David Miller
2007-05-26  5:14 ` Tom "spot" Callaway
2007-05-26 14:45 ` Kyle McMartin
2007-05-26 19:39 ` Martin Habets
2007-05-26 20:32 ` Dave Airlie
2007-05-26 22:46 ` David Miller
2007-05-26 22:59 ` David Miller
2007-05-26 23:00 ` David Miller
2007-05-26 23:41 ` Kyle McMartin
2007-05-27  0:04 ` David Miller
2007-05-28  0:07 ` Martin Habets
2007-05-28  2:49 ` David Miller
2007-05-28  3:11 ` Kyle McMartin
2007-05-28  3:16 ` David Miller
2007-05-28 23:37 ` Martin Habets
2007-05-29  8:12 ` David Miller
2007-05-29 13:18 ` Kyle McMartin
2007-05-29 20:30 ` Martin Habets
2007-05-29 20:59 ` David Miller
2007-05-29 21:08 ` Kyle McMartin
2007-05-30 19:38 ` Martin Habets

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070526002440.GA15449@palantir8 \
    --to=errandir_news@mph.eclipse.co.uk \
    --cc=sparclinux@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.