Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2015 15:39:35 -0700
From:      John-Mark Gurney <jmg@funkthat.com>
To:        Leonardo Fogel <leonardofogel@yahoo.com.br>
Cc:        freebsd-drivers@freebsd.org
Subject:   Re: Memory barrier
Message-ID:  <20151008223935.GH67524@funkthat.com>
In-Reply-To: <1441547636.78646.YahooMailBasic@web120801.mail.ne1.yahoo.com>
References:  <2149458.2Hg3JbBXY3@ralph.baldwin.cx> <1441547636.78646.YahooMailBasic@web120801.mail.ne1.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Leonardo Fogel wrote this message on Sun, Sep 06, 2015 at 06:53 -0700:
> Please, what are the correct barriers for the following cases?
> 
> Case 1:
>    bus_write_1(region_0, ...);
>    /* barrier here */
>    DELAY(some_time);
> 
> Case 2:
>    bus_write_1(region_0, ...);
>    /* barrier here */
>    bus_write_1(region_2, ...);
> 
> In the first one, I want the write to reach the device before the thread busy-waits. As I understand it, bus_space_barrier(9) is not adequate, because it does not prevent the processor from executing instructions (or load/store to RAM) before the write completes.
> 
> In the second one, I want the write to a device (e.g. power management) to complete before the write to another starts/completes. Again, bus_space_barrier() seems not to be adequate because it can not cover two regions.
> 
> Thank you for your time.

If this is a PCI device, you need to do a read from the device before
it is guaranteed that all the bridges have flushed the writes to the
device...  A barrier only guarantees from the processor's perspective
that the write "has completed", but not that it will reach the device..

If this is a different bus, then the rules are probably different...

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20151008223935.GH67524>