<html><body>
<p><font size="2">Hello Scott,</font><br>
<br>
<font size="2">Do you know whether this patch is necessary if I were to use alloc_bootmem() (to set aside a region of contiguous physical memory) instead of the kernel parameter "mem=256"?</font><br>
<br>
<font size="2">-Steve Lin<br>
</font><br>
<br>
<br>
<img width="16" height="16" src="cid:1__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt="Inactive hide details for Scott Wood <scottwood@freescale.com>"><font size="2">Scott Wood <scottwood@freescale.com></font><br>
<br>
<br>

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr valign="top"><td style="background-image:url(cid:2__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com); background-repeat: no-repeat; " width="40%">
<ul>
<ul>
<ul>
<ul><b><font size="2">Scott Wood <scottwood@freescale.com></font></b><font size="2"> </font>
<p><font size="2">11/18/2010 01:35 PM</font></ul>
</ul>
</ul>
</ul>
</td><td width="60%">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr valign="top"><td width="1%"><img width="58" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<div align="right"><font size="2">To</font></div></td><td width="100%"><img width="1" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<font size="2"><steven.lin@teradyne.com></font></td></tr>

<tr valign="top"><td width="1%"><img width="58" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<div align="right"><font size="2">cc</font></div></td><td width="100%"><img width="1" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<font size="2">David Gibson <david@gibson.dropbear.id.au>, Michael Ellerman <michael@ellerman.id.au>, <linuxppc-dev@lists.ozlabs.org></font></td></tr>

<tr valign="top"><td width="1%"><img width="58" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<div align="right"><font size="2">Subject</font></div></td><td width="100%"><img width="1" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""><br>
<font size="2">Re: application needs fast access to physical memory</font></td></tr>
</table>

<table border="0" cellspacing="0" cellpadding="0">
<tr valign="top"><td width="58"><img width="1" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""></td><td width="336"><img width="1" height="1" src="cid:3__=07BBFD4CDFE29A1B8f9e8@notes.teradyne.com" border="0" alt=""></td></tr>
</table>
</td></tr>
</table>
<br>
<tt><font size="2">On Thu, 18 Nov 2010 10:55:21 -0600<br>
<steven.lin@teradyne.com> wrote:<br>
<br>
> Thanks for the replies.<br>
> <br>
> In the Linux Device Drivers book regarding mmap(), it states:<br>
> <br>
>    Mapping a device means associating a range of user-space addresses to<br>
>    device memory.<br>
>    Whenever the program reads or writes in the assigned address range, it<br>
>    is actually<br>
>    accessing the device. In the X server example, using mmap allows quick<br>
>    and easy<br>
>    access to the video card’s memory. For a performance-critical<br>
>    application like this,<br>
>    direct access makes a large difference.<br>
> <br>
> For whatever reason, mmap() is definitely not quick and does not appear to<br>
> be a direct access to device memory. After the application completes a<br>
> large write into physical memory (via the pointer returned from mmap()),<br>
> the application performs an ioctl() to query whether the data actually<br>
> arrived into the memory region. It seems to take some time before the<br>
> associated kernel module actually "sees" the data in the physical memory<br>
> region.<br>
> <br>
> There's a few things I should say about this memory region. There's a total<br>
> of 512 MB of physical memory. U-Boot passes "mem=256M" as a kernel<br>
> parameter to tell Linux to only directly manage the lower 256 MB. The<br>
> special region of physical memory that the application is trying to access<br>
> is the upper 256 MB of memory not directly managed by Linux. The mmap()<br>
> call from the application is:<br>
>    *memptr = (void *) mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,<br>
>    _fdTerAlloc, (off_t) 0x10000000);<br>
<br>
Try this patch:<br>
</font></tt><tt><font size="2"><a href="http://patchwork.ozlabs.org/patch/68246/">http://patchwork.ozlabs.org/patch/68246/</a></font></tt><tt><font size="2"><br>
<br>
-Scott<br>
<br>
</font></tt><br>
</body></html>