Question: Why does my local processor hang every time a read command is issued at my local processor to the PCI bus through direct access of the PCI-DP?
Response: The reason that the local processor gets locked up after issuing a read through direct access to the PCI bus is because the read operation takes a long time and the local processor times out. The delay between the beginning and end of the read transaction on the PCI-DP local bus is approximately 800-900ns, with no additional traffic in the PCI system.
In order to avoid the long latency, the alternative is to use the DMA engine, even to perform single data phase transactions across PCI. The advantage of using the DMA engine is that the transfer is made without holding up the PCI-DP local bus. To set up a DMA read transaction, the DMA Registers are prepared (local destination address specified) and DMA transfer initiated. Independent of the local processor, data is transferred from a PCI target and ends up in a known buffer location in the dual port memory. DMA completion can be determined by local interrupt, or by the local processor polling a status bit of the Local Interrupt Control and Status Register (LINT).
In this case, excessive wait states on the PCI-DP local bus are avoided so the local processor does not time out. The consequence is that there is extra overhead in every PCI transfer since the DMA start address and destination address must be setup before the DMA transfer. For single data element operations, this overhead can be significant. Most accesses, however, will benefit from extra efficiency by transferring blocks of data.