From: Lee Jones <lee-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Eric Anholt <eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
Cc: linux-arm-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Jassi Brar
<jassisinghbrar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Craig McGeachie <slapdau-/E1597aS9LT0CCvOHzKKcA@public.gmane.org>,
Lubomir Rintel <lkundrak-NGH9Lh4a5iE@public.gmane.org>
Subject: Re: [PATCH 1/4] ARM: BCM2835: Add a function for doing an rmb() between device reads.
Date: Wed, 18 Mar 2015 08:26:03 +0000 [thread overview]
Message-ID: <20150318082603.GI3318@x1> (raw)
In-Reply-To: <1426213936-4139-1-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
On Thu, 12 Mar 2015, Eric Anholt wrote:
> Stephen Warren was concerned that the rmb() present in the new mailbox
> driver was unnecessary, and after seeing the docs, that it was just so
> surprising that somebody would come along and remove it later. The
> explanation for the need for the rmb() is long enough that we won't
> want to place it at every callsite. Make a wrapper with the whole
> explanation in it, so that anyone wondering what's going on sees the
> docs right there.
>
> Signed-off-by: Eric Anholt <eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
> ---
> include/soc/bcm2835/peripheral-workaround.h | 75 +++++++++++++++++++++++++++++
> 1 file changed, 75 insertions(+)
> create mode 100644 include/soc/bcm2835/peripheral-workaround.h
>
> diff --git a/include/soc/bcm2835/peripheral-workaround.h b/include/soc/bcm2835/peripheral-workaround.h
> new file mode 100644
> index 0000000..4541a13
> --- /dev/null
> +++ b/include/soc/bcm2835/peripheral-workaround.h
> @@ -0,0 +1,75 @@
> +/*
> + * Copyright © 2015 Broadcom
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +static inline void bcm2835_peripheral_read_workaround(void)
> +{
> +#ifdef CONFIG_ARCH_BCM2835
> + /*
> + * The BCM2835 bus is unusual in that it doesn't guarantee
> + * ordering between reads from different peripherals (where
> + * peripherals roughly correspond to Linux devices). From
> + * BCM2835 ARM Peripherals.pdf, page 7:
> + *
> + * "In order to keep the system complexity low and data
> + * throughput high, the BCM2835 AXI system does not
> + * always return read data in-order. The GPU has special
> + * logic to cope with data arriving out-of-order; however
> + * the ARM core does not contain such logic. Therefore
> + * some precautions must be taken when using the ARM to
> + * access peripherals.
> + *
> + * Accesses to the same peripheral will always arrive and
> + * return in-order. It is only when switching from one
> + * peripheral to another that data can arrive
> + * out-of-order. The simplest way to make sure that data
> + * is processed in-order is to place a memory barrier
> + * instruction at critical positions in the code. You
> + * should place:
> + *
> + * • A memory write barrier before the first write to a
> + * peripheral.
> + * • A memory read barrier after the last read of a
> + * peripheral."
> + *
> + * The footnote explicitly says that:
> + *
> + * "For example:
> + *
> + * a_status = *pointer_to_peripheral_a;
> + * b_status = *pointer_to_peripheral_b;
> + *
> + * Without precuations the values ending up in the
> + * variables a_status and b_status can be swapped
> + * around."
> + *
> + * However, it also notes that, somewhat contrary to the first
> + * bullet point:
> + *
> + * "It is theoretical possible for writes to go ‘wrong’
> + * but that is far more difficult to achieve. The AXI
> + * system makes sure the data always arrives in-order at
> + * its intended destination. So:
> + *
> + * *pointer_to_peripheral_a = value_a;
> + * *pointer_to_peripheral_b = value_b;
> + *
> + * will always give the expected result. The only time
> + * write data can arrive out-of-order is if two different
> + * peripherals are connected to the same external
> + * equipment"
> + *
> + * Since we aren't interacting with multiple peripherals
> + * connected to the same external equipment as far as we know,
> + * that means that we only need to handle the read workaround
> + * case. We do so by placing an rmb() at the first device
> + * read acceess in a given driver path, including the
> + * interrupt handlers.
> + */
> + rmb();
> +#endif
> +}
The format:
#ifdef CONFIG_ARCH_BCM2835
static inline void bcm2835_peripheral_read_workaround(void)
{
<stuff>
}
#else
static inline void bcm2835_peripheral_read_workaround(void) {}
#endif
... is more traditional in the Linux kernel.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
prev parent reply other threads:[~2015-03-18 8:26 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-13 2:32 [PATCH 1/4] ARM: BCM2835: Add a function for doing an rmb() between device reads Eric Anholt
[not found] ` <1426213936-4139-1-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-03-13 2:32 ` [PATCH 2/4 v3] dt/bindings: Add binding for BCM2835 mailbox driver Eric Anholt
[not found] ` <1426213936-4139-2-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-03-17 17:27 ` Lee Jones
2015-03-17 22:14 ` Scott Branden
[not found] ` <5508A75A.4070203-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
2015-03-18 1:34 ` Eric Anholt
2015-03-18 8:23 ` Lee Jones
2015-03-18 8:40 ` Jassi Brar
[not found] ` <CABb+yY0Gc+vJHksKc7ahYfRdh2vzj_VR_bFvjr+K+hiqiah5bg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-18 9:15 ` Lee Jones
2015-03-13 2:32 ` [PATCH 3/4 v4] mailbox: Enable BCM2835 mailbox support Eric Anholt
[not found] ` <1426213936-4139-3-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-03-17 3:33 ` Stephen Warren
[not found] ` <5507A095.5090805-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2015-03-17 18:05 ` Lee Jones
2015-03-17 19:04 ` Eric Anholt
2015-03-18 23:28 ` Eric Anholt
[not found] ` <87619xq414.fsf-omZaPlIz5HhaEpDpdNBo/KxOck334EZe@public.gmane.org>
2015-03-20 4:48 ` Stephen Warren
[not found] ` <550BA6B4.3030604-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2015-03-20 5:12 ` Jassi Brar
[not found] ` <CABb+yY0qN4KcZ9kc6eurSUWPn38f2keKe4FB2efKBAVjREcZbg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-20 17:38 ` Eric Anholt
2015-03-20 17:24 ` Eric Anholt
[not found] ` <87wq2bk2ez.fsf-omZaPlIz5HhaEpDpdNBo/KxOck334EZe@public.gmane.org>
2015-03-20 19:29 ` Stephen Warren
2015-03-18 8:42 ` Lee Jones
2015-03-18 22:39 ` Eric Anholt
[not found] ` <87bnjqorpe.fsf-omZaPlIz5HhaEpDpdNBo/KxOck334EZe@public.gmane.org>
2015-03-19 7:58 ` Lee Jones
2015-03-20 4:46 ` Stephen Warren
2015-03-20 4:44 ` Stephen Warren
2015-03-13 2:32 ` [PATCH 4/4] ARM: bcm2835: Add the mailbox to the device tree Eric Anholt
[not found] ` <1426213936-4139-4-git-send-email-eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>
2015-03-17 3:34 ` Stephen Warren
2015-03-17 3:24 ` [PATCH 1/4] ARM: BCM2835: Add a function for doing an rmb() between device reads Stephen Warren
[not found] ` <55079E79.6030303-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2015-03-17 19:06 ` Eric Anholt
2015-03-18 8:26 ` Lee Jones [this message]
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=20150318082603.GI3318@x1 \
--to=lee-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org \
--cc=jassisinghbrar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=linux-arm-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=lkundrak-NGH9Lh4a5iE@public.gmane.org \
--cc=slapdau-/E1597aS9LT0CCvOHzKKcA@public.gmane.org \
--cc=swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.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).