From: Richard Kuo <rkuo@codeaurora.org>
To: linux-arch@vger.kernel.org, linux-hexagon@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: Arnd Bergmann <arnd@arndb.de>
Subject: [patch v3 04/36] Hexagon: Add atomic ops support
Date: Thu, 08 Sep 2011 20:08:51 -0500 [thread overview]
Message-ID: <20110909010915.075574400@codeaurora.org> (raw)
In-Reply-To: 20110909010847.294039464@codeaurora.org
[-- Attachment #1: atomic.diff --]
[-- Type: text/plain, Size: 5105 bytes --]
Our architecture uses load locked/store conditional type semantics for atomic
ops.
Added inline assembly version of atomic_add_unless.
Signed-off-by: Richard Kuo <rkuo@codeaurora.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
---
arch/hexagon/include/asm/atomic.h | 164 ++++++++++++++++++++++++++++++++++++++
1 file changed, 164 insertions(+)
Index: linux-hexagon-kernel/arch/hexagon/include/asm/atomic.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-hexagon-kernel/arch/hexagon/include/asm/atomic.h 2011-09-07 13:00:30.890646728 -0500
@@ -0,0 +1,164 @@
+/*
+ * Atomic operations for the Hexagon architecture
+ *
+ * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef _ASM_ATOMIC_H
+#define _ASM_ATOMIC_H
+
+#include <linux/types.h>
+
+#define ATOMIC_INIT(i) { (i) }
+#define atomic_set(v, i) ((v)->counter = (i))
+
+/**
+ * atomic_read - reads a word, atomically
+ * @v: pointer to atomic value
+ *
+ * Assumes all word reads on our architecture are atomic.
+ */
+#define atomic_read(v) ((v)->counter)
+
+/**
+ * atomic_xchg - atomic
+ * @v: pointer to memory to change
+ * @new: new value (technically passed in a register -- see xchg)
+ */
+#define atomic_xchg(v, new) (xchg(&((v)->counter), (new)))
+
+
+/**
+ * atomic_cmpxchg - atomic compare-and-exchange values
+ * @v: pointer to value to change
+ * @old: desired old value to match
+ * @new: new value to put in
+ *
+ * Parameters are then pointer, value-in-register, value-in-register,
+ * and the output is the old value.
+ *
+ * Apparently this is complicated for archs that don't support
+ * the memw_locked like we do (or it's broken or whatever).
+ *
+ * Kind of the lynchpin of the rest of the generically defined routines.
+ * Remember V2 had that bug with dotnew predicate set by memw_locked.
+ *
+ * "old" is "expected" old val, __oldval is actual old value
+ */
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+ int __oldval;
+
+ asm volatile(
+ "1: %0 = memw_locked(%1);\n"
+ " { P0 = cmp.eq(%0,%2);\n"
+ " if (!P0.new) jump:nt 2f; }\n"
+ " memw_locked(%1,P0) = %3;\n"
+ " if (!P0) jump 1b;\n"
+ "2:\n"
+ : "=&r" (__oldval)
+ : "r" (&v->counter), "r" (old), "r" (new)
+ : "memory", "p0"
+ );
+
+ return __oldval;
+}
+
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+ int output;
+
+ __asm__ __volatile__ (
+ "1: %0 = memw_locked(%1);\n"
+ " %0 = add(%0,%2);\n"
+ " memw_locked(%1,P3)=%0;\n"
+ " if !P3 jump 1b;\n"
+ : "=&r" (output)
+ : "r" (&v->counter), "r" (i)
+ : "memory", "p3"
+ );
+ return output;
+
+}
+
+#define atomic_add(i, v) atomic_add_return(i, (v))
+
+static inline int atomic_sub_return(int i, atomic_t *v)
+{
+ int output;
+ __asm__ __volatile__ (
+ "1: %0 = memw_locked(%1);\n"
+ " %0 = sub(%0,%2);\n"
+ " memw_locked(%1,P3)=%0\n"
+ " if !P3 jump 1b;\n"
+ : "=&r" (output)
+ : "r" (&v->counter), "r" (i)
+ : "memory", "p3"
+ );
+ return output;
+}
+
+#define atomic_sub(i, v) atomic_sub_return(i, (v))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer to value
+ * @a: amount to add
+ * @u: unless value is equal to u
+ *
+ * Returns 1 if the add happened, 0 if it didn't.
+ */
+static inline int __atomic_add_unless(atomic_t *v, int a, int u)
+{
+ int output;
+ asm volatile(
+ "1: R15 = memw_locked(%1);"
+ " {"
+ " p3 = cmp.eq(R15, %3);"
+ " if (p3.new) jump:nt 2f;"
+ " R15 = add(R15,%2);"
+ " %0 = #0;"
+ " }"
+ " memw_locked(%1,p3) = r15;"
+ " {"
+ " if !p3 jump 1b;"
+ " %0 = #1;"
+ " }"
+ "2:"
+ : "=&r" (output)
+ : "r" (v), "r" (a), "r" (u)
+ : "memory", "p3", "r15"
+ );
+ return output;
+}
+
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
+#define atomic_inc(v) atomic_add(1, (v))
+#define atomic_dec(v) atomic_sub(1, (v))
+
+#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
+#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
+#define atomic_sub_and_test(i, v) (atomic_sub_return(i, (v)) == 0)
+#define atomic_add_negative(i, v) (atomic_add_return(i, (v)) < 0)
+
+
+#define atomic_inc_return(v) (atomic_add_return(1, v))
+#define atomic_dec_return(v) (atomic_sub_return(1, v))
+
+#endif
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2011-09-09 1:08 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-09 1:08 [patch v3 00/36] Hexagon: Add support for Qualcomm Hexagon architecture Richard Kuo
2011-09-09 1:08 ` [patch v3 01/36] Hexagon: Add generic headers Richard Kuo
2011-09-09 1:08 ` [patch v3 02/36] Hexagon: Core arch-specific header files Richard Kuo
2011-09-09 1:08 ` [patch v3 03/36] Hexagon: Add bitops support Richard Kuo
2011-09-09 1:08 ` Richard Kuo [this message]
2011-09-09 1:08 ` [patch v3 05/36] Hexagon: Add syscalls Richard Kuo
2011-09-09 8:05 ` Arnd Bergmann
2011-09-09 1:08 ` [patch v3 06/36] Hexagon: Add processor and system headers Richard Kuo
2011-09-09 1:08 ` [patch v3 07/36] Hexagon: Add threadinfo Richard Kuo
2011-09-09 1:08 ` [patch v3 08/36] Hexagon: Add delay functions Richard Kuo
2011-09-09 8:07 ` Arnd Bergmann
2011-09-09 1:08 ` [patch v3 09/36] Hexagon: Add checksum functions Richard Kuo
2011-09-09 1:08 ` [patch v3 10/36] Hexagon: Add memcpy and memset accelerated functions Richard Kuo
2011-09-09 1:08 ` [patch v3 11/36] Hexagon: Add hypervisor interface Richard Kuo
2011-09-09 1:08 ` [patch v3 12/36] Hexagon: Export ksyms defined in assembly files Richard Kuo
2011-09-09 1:09 ` [patch v3 13/36] Hexagon: Support dynamic module loading Richard Kuo
2011-09-09 1:09 ` [patch v3 14/36] Hexagon: Add signal functions Richard Kuo
2011-09-09 8:12 ` Arnd Bergmann
2011-09-11 14:59 ` Benjamin Herrenschmidt
2011-09-09 1:09 ` [patch v3 15/36] Hexagon: Add init_task and process functions Richard Kuo
2011-09-09 1:09 ` [patch v3 16/36] Hexagon: Add startup code Richard Kuo
2011-09-09 1:09 ` [patch v3 17/36] Hexagon: Add interrupts Richard Kuo
2011-09-09 13:04 ` Thomas Gleixner
2011-09-09 18:57 ` Linas Vepstas (Code Aurora)
2011-09-09 1:09 ` [patch v3 18/36] Hexagon: Add time and timer functions Richard Kuo
2011-09-09 8:23 ` Arnd Bergmann
2011-09-09 13:13 ` Thomas Gleixner
2011-09-09 1:09 ` [patch v3 19/36] Hexagon: Add ptrace support Richard Kuo
2011-09-09 8:15 ` Arnd Bergmann
2011-09-09 20:15 ` Jonas Bonn
2011-09-09 21:18 ` Linas Vepstas (Code Aurora)
2011-09-10 6:42 ` Jonas Bonn
2011-09-10 11:21 ` Arnd Bergmann
2011-09-10 11:29 ` Pedro Alves
2011-09-19 15:25 ` Linas Vepstas (Code Aurora)
2011-09-21 16:15 ` Pedro Alves
2011-09-21 17:50 ` Linas Vepstas (Code Aurora)
2011-09-21 18:04 ` Pedro Alves
2011-09-09 1:09 ` [patch v3 20/36] Hexagon: Provide basic debugging and system trap support Richard Kuo
2011-09-09 1:09 ` [patch v3 21/36] Hexagon: Add SMP support Richard Kuo
2011-09-09 8:16 ` Arnd Bergmann
2011-09-09 13:24 ` Thomas Gleixner
2011-09-11 14:51 ` Benjamin Herrenschmidt
2011-09-12 23:38 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 22/36] Hexagon: Add locking types and functions Richard Kuo
2011-09-09 8:17 ` Arnd Bergmann
2011-09-09 1:09 ` [patch v3 23/36] Hexagon: Add user access functions Richard Kuo
2011-09-09 1:09 ` [patch v3 24/36] Hexagon: Provide basic implementation and/or stubs for I/O routines Richard Kuo
2011-09-09 8:18 ` Arnd Bergmann
2011-09-09 19:14 ` Linas Vepstas (Code Aurora)
2011-09-09 21:13 ` Arnd Bergmann
2011-09-10 20:02 ` Taylor Simpson
2011-09-11 14:46 ` Benjamin Herrenschmidt
2011-09-09 1:09 ` [patch v3 25/36] Hexagon: Implement basic cache-flush support Richard Kuo
2011-09-09 1:09 ` [patch v3 26/36] Hexagon: Implement basic TLB management routines for Hexagon Richard Kuo
2011-09-09 1:09 ` [patch v3 27/36] Hexagon: Provide DMA implementation Richard Kuo
2011-09-09 1:09 ` [patch v3 28/36] Hexagon: Add ioremap support Richard Kuo
2011-09-09 8:19 ` Arnd Bergmann
2011-09-09 1:09 ` [patch v3 29/36] Hexagon: Add page table header files & etc Richard Kuo
2011-09-09 8:20 ` Arnd Bergmann
2011-09-09 1:09 ` [patch v3 30/36] Hexagon: Add page-fault support Richard Kuo
2011-09-11 15:08 ` Benjamin Herrenschmidt
2011-09-13 1:34 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 31/36] Hexagon: kgdb support files Richard Kuo
2011-09-09 1:09 ` [patch v3 32/36] Hexagon: Comet platform support Richard Kuo
2011-09-09 1:09 ` [patch v3 33/36] Hexagon: Add configuration and makefiles for the Hexagon architecture Richard Kuo
2011-09-09 1:09 ` [patch v3 34/36] Hexagon: Add basic stacktrace functionality for " Richard Kuo
2011-09-09 1:09 ` [patch v3 35/36] Hexagon: Add self to MAINTAINERS Richard Kuo
2011-09-09 8:21 ` Arnd Bergmann
2011-09-09 1:09 ` [patch v3 36/36] Add extra arch overrides to asm-generic/checksum.h Richard Kuo
2011-09-09 8:39 ` [patch v3 00/36] Hexagon: Add support for Qualcomm Hexagon architecture Arnd Bergmann
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=20110909010915.075574400@codeaurora.org \
--to=rkuo@codeaurora.org \
--cc=arnd@arndb.de \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hexagon@vger.kernel.org \
--cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).