If all of the responses to a transaction have not been received within the time
allotted (programmed by the Timeout Value Register (Base Address + 0x10)) or if a
transaction was never accepted (Command Timeout) and placed on the timeout queue,
then a transaction is considered to have timed out. The interrupt indicates that the
gasket is flushing the transaction and that information has been logged about the
transaction that timed out in the following registers:
- Error Transaction Valid/Dir/ID Register (Base Address + 0x38)
- Error Transaction RouteID/OrderID Register (Base Address + 0x3C)
- Error Transaction Bytecnt Register (Base Address + 0x40)
- Error Transaction Upper Address Register (Base Address + 0x44)
- Error Transaction Lower Address Register (Base Address + 0x48)
When servicing a Transaction Timeout Error, software should perform the following
steps:
- Read the Timeout Error Info Register (Base Address + 0x30) to determine how
many transaction timeouts have occurred since last serviced
- Read the Error Transaction Valid/Dir/ID Register (Base Address + 0x38)
- If the valid field is 0 or the type field is Unexpected Response,
then these registers do not contain any information about the timed
out transaction, skip to step 4
- Read the information from the following registers:
- Error Transaction RouteID/OrderID Register (Base Address +
0x3C)
- Error Transaction Bytecnt Register (Base Address + 0x40)
- Error Transaction Upper Address Register (Base Address + 0x44)
- Error Transaction Lower Address Register (Base Address + 0x48)
- Error Transaction Lower Address Register (Base Address + 0x48)
- Write the number of timed out events serviced this ISR (read in step 1) to
the Timeout Error Info Register (Base Address + 0x30)
- Clear the interrupt by writing to the appropriate bit in the Error Interrupt
Enabled Status/Clear Register (Base Address + 0x24)
If the write in step 4 does not decrement the value to 0 (because a new transaction
has timed out), then the interrupt will re-issue after the write in step 5.
This section only describes how to service the interrupt. It is up to the system
integrator to decide what actions to take based on this information. Suggestions
are:
- Log the information for debug purposes
- Determine the slave that is unresponsive and take appropriate action
- Reset target slave
- Reset main SoC
- Reset whole device