From: Robert Hancock <rwh461@mail.usask.ca>
To: Dan Gora <dan.gora@gmail.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: PCI Bursting with PIO
Date: Sat, 16 Feb 2008 00:00:38 -0600 [thread overview]
Message-ID: <47B67C06.6060706@mail.usask.ca> (raw)
In-Reply-To: <fa.Mbzb1/2dWnp5V/5ElzijlkAstZU@ifi.uio.no>
Dan Gora wrote:
> Hi,
>
> I am trying to optimize a driver for a slave only PCI device and am
> having a lot of trouble getting any kind of PCI burst transactions in
> either the read or the write direction. Using bcopy/memcpy or even a
> hand-crafted while (len) { *pdst++ = *psrc++} (with pdst and psrc
> unsigned long*) I can only get writes to burst and even in that case
> only for 2 data phases (8 bytes) and only on 64 bit machines. The
> best that I have managed is to use a hand crafted asm function which
> copies the data through mmx registers on i386 machines, but that still
> only bursts a maximum of 16 bytes in the write direction and not at
> all in the read direction. The source and destination pointers are
> both aligned to 8 byte boundaries, so I don't think that it's an
> alignment issue.
The chipset is being limited by what the CPU is giving it. If the CPU
sends only a small amount of data in one access then the chipset usually
does not try to burst more than that.
>
> Is there any way to get PIO to burst over the PCI bus in the read and
> write direction? My device has 4 BAR registers, but the area where I
> am transferring data is marked 'prefetchable' (although the others are
> not). I read here: http://lkml.org/lkml/2004/9/23/393 that this was a
> prerequisite, but it is apparently not sufficient. He also mentioned
> that the area had to be marked as write-back, but it's not clear how
> you can tell (no /proc/mtrr doesn't tell you) or that it has anything
> to do with bursting reads.
>
> Any ideas would be really appreciated,
Well, in order for the CPU to batch up more writes you'd have to map the
BAR as either write-combining or write-back. If it's not listed in
/proc/mtrr it will be the default setting of uncacheable. X has code to
set up the video memory on the video card as write-combining so it can
get better write performance, you could do something similar.
Setting it as write-back might allow you to get the reads to do bursting
as well (since the CPU will do a cache-line fill instead of individual
accesses) but this if the device is modifying this memory area, unless
you add code to invalidate those cache lines before reading the data
you'll get stale data back. You could run into some other less obvious
issues as well, as normally device memory regions are not mapped write-back.
In general, especially if you need to read data back from the device,
implementing a DMA engine would be by far the better option. Most
chipsets seem not at all optimized for handling sequential reads from
PCI memory from the CPU. (Even in the DMA case, you have to be careful
with what type of memory read transaction you use when transferring from
host memory - some chipsets don't like to burst more than one cycle if
you use normal Memory Read instead of Memory Read Line or Memory Read
Multiple.)
next parent reply other threads:[~2008-02-16 6:01 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <fa.Mbzb1/2dWnp5V/5ElzijlkAstZU@ifi.uio.no>
2008-02-16 6:00 ` Robert Hancock [this message]
2008-02-17 4:53 ` PCI Bursting with PIO Dan Gora
[not found] <fa.QF1nJvJhMpLvtquNDa6sbADHwhs@ifi.uio.no>
[not found] ` <fa.LrKLA2l3F3abMpHk4aDjFfwzFVI@ifi.uio.no>
[not found] ` <fa.kFanAY/O5VMnSf6YXqEyxmsR62U@ifi.uio.no>
2008-02-17 19:06 ` Robert Hancock
2008-02-15 3:28 Dan Gora
2008-02-15 10:54 ` Andi Kleen
2008-02-15 17:55 ` Dan Gora
2008-02-15 13:02 ` Alan Cox
2008-02-15 18:00 ` Dan Gora
2008-02-15 18:41 ` H. Peter Anvin
2008-02-15 19:00 ` Alan Cox
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=47B67C06.6060706@mail.usask.ca \
--to=rwh461@mail.usask.ca \
--cc=dan.gora@gmail.com \
--cc=linux-kernel@vger.kernel.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