linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: "Ian Munsie" <imunsie@au1.ibm.com>
To: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	benh@kernel.crashing.org
Cc: paulus@samba.org, Ian Munsie <imunsie@au1.ibm.com>
Subject: [PATCH 10/18] powerpc: Support endian agnostic MMIO
Date: Fri,  1 Oct 2010 17:06:03 +1000	[thread overview]
Message-ID: <1285916771-18033-11-git-send-email-imunsie@au1.ibm.com> (raw)
In-Reply-To: <1285916771-18033-1-git-send-email-imunsie@au1.ibm.com>

From: Ian Munsie <imunsie@au1.ibm.com>

This patch maps the MMIO functions for 32bit PowerPC to their
appropriate instructions depending on CPU endianness.

The macros used to create the corresponding inline functions are also
renamed by this patch. Previously they had BE or LE in their names which
was misleading - they had nothing to do with endianness, but actually
created different instruction forms so their new names reflect the
instruction form they are creating (D-Form and X-Form).

Little endian 64bit PowerPC is not supported, so the lack of mappings
(and corresponding breakage) for that case is intentional to bring the
attention of anyone doing a 64bit little endian port. 64bit big endian
is unaffected.

Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
---
 arch/powerpc/include/asm/io.h |   51 ++++++++++++++++++++++++++--------------
 1 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
index 001f2f1..fd8e922 100644
--- a/arch/powerpc/include/asm/io.h
+++ b/arch/powerpc/include/asm/io.h
@@ -97,7 +97,7 @@ extern resource_size_t isa_mem_base;
 
 /* gcc 4.0 and older doesn't have 'Z' constraint */
 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)
-#define DEF_MMIO_IN_LE(name, size, insn)				\
+#define DEF_MMIO_IN_X(name, size, insn)				\
 static inline u##size name(const volatile u##size __iomem *addr)	\
 {									\
 	u##size ret;							\
@@ -106,7 +106,7 @@ static inline u##size name(const volatile u##size __iomem *addr)	\
 	return ret;							\
 }
 
-#define DEF_MMIO_OUT_LE(name, size, insn) 				\
+#define DEF_MMIO_OUT_X(name, size, insn) 				\
 static inline void name(volatile u##size __iomem *addr, u##size val)	\
 {									\
 	__asm__ __volatile__("sync;"#insn" %1,0,%2"			\
@@ -114,7 +114,7 @@ static inline void name(volatile u##size __iomem *addr, u##size val)	\
 	IO_SET_SYNC_FLAG();						\
 }
 #else /* newer gcc */
-#define DEF_MMIO_IN_LE(name, size, insn)				\
+#define DEF_MMIO_IN_X(name, size, insn)				\
 static inline u##size name(const volatile u##size __iomem *addr)	\
 {									\
 	u##size ret;							\
@@ -123,7 +123,7 @@ static inline u##size name(const volatile u##size __iomem *addr)	\
 	return ret;							\
 }
 
-#define DEF_MMIO_OUT_LE(name, size, insn) 				\
+#define DEF_MMIO_OUT_X(name, size, insn) 				\
 static inline void name(volatile u##size __iomem *addr, u##size val)	\
 {									\
 	__asm__ __volatile__("sync;"#insn" %1,%y0"			\
@@ -132,7 +132,7 @@ static inline void name(volatile u##size __iomem *addr, u##size val)	\
 }
 #endif
 
-#define DEF_MMIO_IN_BE(name, size, insn)				\
+#define DEF_MMIO_IN_D(name, size, insn)				\
 static inline u##size name(const volatile u##size __iomem *addr)	\
 {									\
 	u##size ret;							\
@@ -141,7 +141,7 @@ static inline u##size name(const volatile u##size __iomem *addr)	\
 	return ret;							\
 }
 
-#define DEF_MMIO_OUT_BE(name, size, insn)				\
+#define DEF_MMIO_OUT_D(name, size, insn)				\
 static inline void name(volatile u##size __iomem *addr, u##size val)	\
 {									\
 	__asm__ __volatile__("sync;"#insn"%U0%X0 %1,%0"			\
@@ -149,22 +149,37 @@ static inline void name(volatile u##size __iomem *addr, u##size val)	\
 	IO_SET_SYNC_FLAG();						\
 }
 
+DEF_MMIO_IN_D(in_8,     8, lbz);
+DEF_MMIO_OUT_D(out_8,   8, stb);
 
-DEF_MMIO_IN_BE(in_8,     8, lbz);
-DEF_MMIO_IN_BE(in_be16, 16, lhz);
-DEF_MMIO_IN_BE(in_be32, 32, lwz);
-DEF_MMIO_IN_LE(in_le16, 16, lhbrx);
-DEF_MMIO_IN_LE(in_le32, 32, lwbrx);
+#ifdef __BIG_ENDIAN__
+DEF_MMIO_IN_D(in_be16, 16, lhz);
+DEF_MMIO_IN_D(in_be32, 32, lwz);
+DEF_MMIO_IN_X(in_le16, 16, lhbrx);
+DEF_MMIO_IN_X(in_le32, 32, lwbrx);
 
-DEF_MMIO_OUT_BE(out_8,     8, stb);
-DEF_MMIO_OUT_BE(out_be16, 16, sth);
-DEF_MMIO_OUT_BE(out_be32, 32, stw);
-DEF_MMIO_OUT_LE(out_le16, 16, sthbrx);
-DEF_MMIO_OUT_LE(out_le32, 32, stwbrx);
+DEF_MMIO_OUT_D(out_be16, 16, sth);
+DEF_MMIO_OUT_D(out_be32, 32, stw);
+DEF_MMIO_OUT_X(out_le16, 16, sthbrx);
+DEF_MMIO_OUT_X(out_le32, 32, stwbrx);
+#else
+DEF_MMIO_IN_X(in_be16, 16, lhbrx);
+DEF_MMIO_IN_X(in_be32, 32, lwbrx);
+DEF_MMIO_IN_D(in_le16, 16, lhz);
+DEF_MMIO_IN_D(in_le32, 32, lwz);
+
+DEF_MMIO_OUT_X(out_be16, 16, sthbrx);
+DEF_MMIO_OUT_X(out_be32, 32, stwbrx);
+DEF_MMIO_OUT_D(out_le16, 16, sth);
+DEF_MMIO_OUT_D(out_le32, 32, stw);
+#endif /* __BIG_ENDIAN */
 
 #ifdef __powerpc64__
-DEF_MMIO_OUT_BE(out_be64, 64, std);
-DEF_MMIO_IN_BE(in_be64, 64, ld);
+
+#ifndef __LITTLE_ENDIAN__
+DEF_MMIO_OUT_D(out_be64, 64, std);
+DEF_MMIO_IN_D(in_be64, 64, ld);
+#endif
 
 /* There is no asm instructions for 64 bits reverse loads and stores */
 static inline u64 in_le64(const volatile u64 __iomem *addr)
-- 
1.7.1

  parent reply	other threads:[~2010-10-01  7:06 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-01  7:05 Introduce support for little endian PowerPC Ian Munsie
2010-10-01  7:05 ` [PATCH 01/18] powerpc: Add ability to build little endian kernels Ian Munsie
2010-10-01  9:18   ` Kumar Gala
2010-10-01 11:28     ` Josh Boyer
2010-10-01 12:09       ` Benjamin Herrenschmidt
2010-10-01 11:40   ` Josh Boyer
2010-10-01 12:22     ` Benjamin Herrenschmidt
2010-10-01  7:05 ` [PATCH 02/18] powerpc: Add CROSSBE_COMPILE to build big endian boot wrapper Ian Munsie
2010-10-01  7:13   ` Geert Uytterhoeven
2010-10-01  7:19     ` Ian Munsie
2010-10-01  7:05 ` [PATCH 03/18] powerpc: Support parsing a little endian kernel from zImage wrapper Ian Munsie
2010-10-01  7:05 ` [PATCH 04/18] powerpc: Allow taishan platform to boot a little endian kernel Ian Munsie
2010-10-01  7:05 ` [PATCH 05/18] powerpc: Wire up 44x little endian boot for remaining 44x targets Ian Munsie
2010-10-01 11:27   ` Josh Boyer
2010-10-06  1:28     ` Ian Munsie
2010-10-06  1:55       ` Josh Boyer
2010-10-06  2:10         ` Sean MacLennan
2010-10-01  7:05 ` [PATCH 06/18] powerpc 44x: Set E bit in TLBs and PTEs when CPU is in little endian mode Ian Munsie
2010-10-01  7:06 ` [PATCH 07/18] powerpc: Use generic bitops for little endian bitmap operations Ian Munsie
2010-10-01  7:06 ` [PATCH 08/18] powerpc: Include the appropriate endianness header Ian Munsie
2010-10-01  7:06 ` [PATCH 09/18] powerpc: Support device tree regardless of CPU endianness Ian Munsie
2010-10-03  3:15   ` Grant Likely
2010-10-03  6:22     ` Benjamin Herrenschmidt
2010-10-01  7:06 ` Ian Munsie [this message]
2010-10-01  7:06 ` [PATCH 11/18] powerpc: Make assembly endian agnostic when accessing 64bit values Ian Munsie
2010-10-01  7:06 ` [PATCH 12/18] powerpc 44x: Handle TLB miss regardless of endianness Ian Munsie
2010-10-01  7:06 ` [PATCH 13/18] powerpc 44x: Make DCR endianness agnostic Ian Munsie
2010-10-01  7:06 ` [PATCH 14/18] powerpc, of_serial: Endianness issues setting up the serial ports Ian Munsie
2010-10-07 23:23   ` Grant Likely
2010-10-01  7:06 ` [PATCH 15/18] mtd: Fix endianness issues from device tree Ian Munsie
2010-10-01 19:29   ` Artem Bityutskiy
2010-10-01  7:06 ` [PATCH 16/18] powerpc: Fix endianness issues in alignment handler Ian Munsie
2010-10-01  7:06 ` [PATCH 17/18] net: Fix endianess issues in IBM newemac driver Ian Munsie
2010-10-01  7:06 ` [PATCH 18/18] powerpc: Fix jiffies variable on little endian Ian Munsie
2010-10-01  9:02 ` Introduce support for little endian PowerPC Kumar Gala
2010-10-01 11:30   ` Josh Boyer
2010-10-01 11:55     ` Gary Thomas
2010-10-01 12:15       ` Benjamin Herrenschmidt
2010-10-01 12:37         ` Gary Thomas
2010-10-01 12:14     ` Benjamin Herrenschmidt
2010-10-01 16:20       ` Michel Dänzer
2010-10-01 20:50         ` Benjamin Herrenschmidt
2010-10-04 10:30           ` Michel Dänzer
2010-10-04 22:50             ` Benjamin Herrenschmidt
2010-10-01 17:59       ` Kumar Gala
2010-10-01 20:51         ` Benjamin Herrenschmidt
2010-10-01 22:03           ` Olof Johansson
2010-10-01 22:28             ` Benjamin Herrenschmidt
2010-10-07 16:25             ` Hollis Blanchard
2010-10-01 11:36 ` Josh Boyer
2010-10-01 12:21   ` Benjamin Herrenschmidt
2010-10-06  1:04   ` Ian Munsie

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=1285916771-18033-11-git-send-email-imunsie@au1.ibm.com \
    --to=imunsie@au1.ibm.com \
    --cc=benh@kernel.crashing.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=paulus@samba.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).