[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

REQ# deassertion

Section 3.4.3 (pg. 61) of PCI 2.1 says:
When the bus is parked at an agent, the agent is allowed to start a
transaction without REQ# being asserted. (A master can start a
transaction when the bus is in the Idle state and GNT# is asserted.)
When the agent needs to do multiple transactions, it should assert
REQ# to inform the arbiter that it intends to do multiple
transactions. When a master requires only a single transaction, it
should not assert REQ#; otherwise, the arbiter may continue to assert
its GNT# when it does not require use of the bus.

But what about a single transaction with multiple data transfers? 
As a PCI master, with some Pentium chipsets I have seen them not do GNT#
parking, and take away GNT# after I assert FRAME#. If my MLT is low
then this may cause a timeout on a burst, in which case I have to
re-arbitrate for GNT#. Similarly, if the target issues a disconnect
then I have to re-assert REQ#.

With other chipsets, it leaves GNT# on me as long as REQ# is low. If I
pull up REQ# because this is the last transaction, I have similar
problems if this a long burst that times out or gets disconnected.

I'm considering keeping REQ# asserted until I get to the second to
last piece of data I want to transfer (no prefetching involoved). This
allows me to avoid having to re-abritrate to finish an interuppted
burst and also gives the arbiter time to give grant to another agent
(the bus is busy, this can happen in one cycle).

Does this violate the spirit or law of the spec????