none
Can I get a PCIe to do burst transfers? RRS feed

  • Question

  • In short, any read from memory-mapped space over PCIe is broken into single-word transfers. The PCIe port is capable of much larger transfers though, even with the device as slave. Is there a way to make the PC do bursts? For example, would it be possible to mark the memory as cachable and then use cache management functions to trigger larger block transfers?

    What I'm currently seeing is that when I read large blocks of data via PCIe (it's not performance critical) the system gets "crippled". Apart from taking up a CPU, as is to be expected, apparently all I/O is blocked, because even the mouse won't move while reading. Now that is something I did not expect.

    Just calling READ_REGISTER_BUFFER_ULONG with a large buffer demonstrates the problem. I looked at its implementation and it's just a memory barrier followed by a regular memcopy-like. Replacing this with other memcpy calls does not make a difference.

    I'm perfectly aware that I could use DMA to do the transfer, it's just that I'm curious here as to what happens. For example, when handling interrupt requests, I usually need to read a few registers to determine what's going on in the device. Given that each read takes close to a microsecond to complete, the cost of these register reads is enormous compared to the other things happening in there. Being able to read a small amount of registers in one transaction would therefore greatly reduce the IRQ's overhead. From the way things look, it's apparently much more efficient to place results into the PC memory instead of in device's registers.

    Tuesday, September 15, 2015 9:19 AM

All replies

  • So your answer is: "I don't know", with a bit of "I don't care" added for good measure.

    Maybe a bit of rephrasing the question will help:

    The PCIe specification requires my device to do burst reads, but Windows is incapable of ever submitting a burst request?

    Wednesday, September 16, 2015 11:39 AM