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

Re: REQ# deassertion



I hate answering my own question...

I (accidently) found 3.3.3.2.2. which says:

---
Requirements on a Master Because of Target Termination
Although not all targets will implement all forms of target
termination, masters must be capable of properly dealing with them
all. Deassertion of REQ# When Target Terminated When the current
transaction is terminated by the target either by Retry or Disconnect
(with or without data), the master must deassert its REQ# signal
before repeating the transaction. The master must deassert REQ# for a
minimum of two clocks, one being when the bus goes to the Idle state
(at the end of the transaction where STOP# was asserted) and either
the clock before or the clock after the Idle state. If another master
is waiting to use the bus, the arbiter is required to grant a
different master access to the bus to prevent deadlocks. It also
allows other masters to use the bus which would normally be wasted
since the master would attempt to complete the transaction that was
terminated by the target. The master is not required to deassert its
REQ# when the target requests the transaction to end by asserting
STOP# in the last data phase. An example is Figure 3-7 which is really
Master Completion termination and not target termination.
---

This prevents keeping REQ# low to deal with Retry and Disconnect, but
what about MLT? Is it fair to keep REQ# low to avoid MLT? I admit, a
bit contrary to the point of MLT, but so is an arbiter that takes GNT#
away when there isn't another agent that wants to start a
transfer... I think I'll trust the arbiter to be good and pay the
penalty when it isn't.

Sorry,
RoLanD 

On Mar 27, Scott RoLanD <shr@s3.com> wrote: 
> 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????
> 
> TIA,
> RoLanD
> 
|
j