From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Taylor Simpson <tsimpson@codeaurora.org>
Cc: 'Arnd Bergmann' <arnd@arndb.de>,
"'Linas Vepstas (Code Aurora)'" <linas@codeaurora.org>,
'Richard Kuo' <rkuo@codeaurora.org>,
linux-arch@vger.kernel.org, linux-hexagon@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: RE: [patch v3 24/36] Hexagon: Provide basic implementation and/or stubs for I/O routines.
Date: Sun, 11 Sep 2011 11:46:55 -0300 [thread overview]
Message-ID: <1315752415.455.47.camel@pasglop> (raw)
In-Reply-To: <000001cc6ff4$8d706b00$a8514100$@org>
On Sat, 2011-09-10 at 15:02 -0500, Taylor Simpson wrote:
> Using "memory" is a pretty big hammer. Wouldn't it be better to use a
> memory operand?
> asm volatile(
> "memb(%0) = %1;"
> : "m" (*(u8*)addr)
> : "r" (data)
> );
No you probably really want a full "memory" clobber, because typically
your IO ops should also act as barriers. The compiler has no way to know
for example that you want to order previous stores to memory (some DMA
descriptor you are populating) vs. an MMIO access that will trigger the
DMA from that location.
Linux defines the readX/writeX accessors as being fully ordered in that
case.
In fact, I'm not familiar with Hexagon, but if it's a weakly ordered
memory model you may also need some kind of memory barrier in those
accessors.
Cheers,
Ben.
> This may be a dumb question, but why do we need inline asm? Why can't we
> write this with plain C code?
> /*
> * writeb - write a byte to a memory location
> * @data: data to write to
> * @addr: pointer to memory
> *
> */
> static inline void writeb(u8 data, volatile void __iomem *addr) {
> volatile u8 *ptr = (volatile u8*)addr;
> *ptr = data;
> }
>
>
> Taylor
>
>
>
> -----Original Message-----
> From: linux-hexagon-owner@vger.kernel.org
> [mailto:linux-hexagon-owner@vger.kernel.org] On Behalf Of Arnd Bergmann
> Sent: Friday, September 09, 2011 4:13 PM
> To: Linas Vepstas (Code Aurora)
> Cc: Richard Kuo; linux-arch@vger.kernel.org; linux-hexagon@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: Re: [patch v3 24/36] Hexagon: Provide basic implementation and/or
> stubs for I/O routines.
>
> On Friday 09 September 2011 14:14:13 Linas Vepstas wrote:
> > On Thu, Sep 08, 2011 at 08:09:11PM -0500, Richard Kuo wrote:
> > > + asm volatile(
> > > + "memb(%0) = %1;"
> > > + :
> > > + : "r" (addr), "r" (data)
> > > + );
> >
> > I'm kind-of vague on this, but I think that this also needs a
> > : "memory" at the end (to indicate that the asm snippet clobbers
> > memory), as otherwise the compiler may be tempted to reorder
> > these around other memory accesses. That is, the "volatile"
> > keyword is not enough (well, I'm not sure...), but I think
> > "volatile" only prevents the compiler from optimizing these
> > away completely, but is not enough to prevent unwanted
> > re-ordering.
>
> Yes, absolutely correct. Specifically, this is required for the
> case where you first store values into regular memory and then
> use the writel() to trigger a DMA operation. Without the memory
> clobber, the dma may read from memory before the CPU has accessed
> it in case the store gets scheduled after the writel by the compiler.
>
> Arnd
> --
> To unsubscribe from this list: send the line "unsubscribe linux-hexagon" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2011-09-11 14:46 UTC|newest]
Thread overview: 124+ 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 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 01/36] Hexagon: Add generic headers Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 02/36] Hexagon: Core arch-specific header files Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 03/36] Hexagon: Add bitops support Richard Kuo
2011-09-09 1:08 ` [patch v3 04/36] Hexagon: Add atomic ops support Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 05/36] Hexagon: Add syscalls Richard Kuo
2011-09-09 1:08 ` 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 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 07/36] Hexagon: Add threadinfo Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 08/36] Hexagon: Add delay functions Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 8:07 ` Arnd Bergmann
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 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 11/36] Hexagon: Add hypervisor interface Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:08 ` [patch v3 12/36] Hexagon: Export ksyms defined in assembly files Richard Kuo
2011-09-09 1:08 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 13/36] Hexagon: Support dynamic module loading Richard Kuo
2011-09-09 1:09 ` 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-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 1:09 ` Richard Kuo
2011-09-09 13:04 ` Thomas Gleixner
2011-09-09 18:57 ` Linas Vepstas (Code Aurora)
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 8:23 ` Arnd Bergmann
2011-09-09 13:13 ` Thomas Gleixner
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 1:09 ` Richard Kuo
2011-09-09 8:15 ` Arnd Bergmann
2011-09-09 8:15 ` Arnd Bergmann
2011-09-09 20:15 ` Jonas Bonn
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 6:42 ` Jonas Bonn
2011-09-10 11:21 ` Arnd Bergmann
2011-09-10 11:21 ` Arnd Bergmann
2011-09-10 11:29 ` Pedro Alves
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 16:15 ` Pedro Alves
2011-09-21 17:50 ` Linas Vepstas (Code Aurora)
2011-09-21 17:50 ` Linas Vepstas (Code Aurora)
2011-09-21 18:04 ` Pedro Alves
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 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 21/36] Hexagon: Add SMP support Richard Kuo
2011-09-09 1:09 ` Richard Kuo
2011-09-09 8:16 ` Arnd Bergmann
2011-09-09 8:16 ` Arnd Bergmann
2011-09-09 13:24 ` Thomas Gleixner
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 1:09 ` Richard Kuo
2011-09-09 8:17 ` Arnd Bergmann
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 1:09 ` Richard Kuo
2011-09-09 8:18 ` Arnd Bergmann
2011-09-09 8:18 ` Arnd Bergmann
2011-09-09 19:14 ` Linas Vepstas (Code Aurora)
2011-09-09 19:14 ` Linas Vepstas (Code Aurora)
2011-09-09 21:13 ` Arnd Bergmann
2011-09-09 21:13 ` Arnd Bergmann
2011-09-10 20:02 ` Taylor Simpson
2011-09-10 20:02 ` Taylor Simpson
2011-09-11 14:46 ` Benjamin Herrenschmidt [this message]
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 ` 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 1:09 ` Richard Kuo
2011-09-09 8:19 ` Arnd Bergmann
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-09 1:09 ` Richard Kuo
2011-09-11 15:08 ` Benjamin Herrenschmidt
2011-09-11 15:08 ` Benjamin Herrenschmidt
2011-09-13 1:34 ` Richard Kuo
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 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 32/36] Hexagon: Comet platform support Richard Kuo
2011-09-09 1:09 ` 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 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 34/36] Hexagon: Add basic stacktrace functionality for " Richard Kuo
2011-09-09 1:09 ` Richard Kuo
2011-09-09 1:09 ` [patch v3 35/36] Hexagon: Add self to MAINTAINERS Richard Kuo
2011-09-09 1:09 ` Richard Kuo
2011-09-09 8:21 ` Arnd Bergmann
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 1:09 ` Richard Kuo
2011-09-09 8:39 ` [patch v3 00/36] Hexagon: Add support for Qualcomm Hexagon architecture Arnd Bergmann
2011-09-09 8:39 ` 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=1315752415.455.47.camel@pasglop \
--to=benh@kernel.crashing.org \
--cc=arnd@arndb.de \
--cc=linas@codeaurora.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hexagon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rkuo@codeaurora.org \
--cc=tsimpson@codeaurora.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).