SPRUJ28E November 2021 – September 2024 AM68 , AM68A , TDA4AL-Q1 , TDA4VE-Q1 , TDA4VL-Q1
Every TR that is active is placed in one of the DRU queues. Each queue operates independently of the others. In a given queue the TRs complete in the order they are placed by the subtiler. Only one read and one write queue may exist at a time. The queues use same resources and need arbitration which is performed based on fixed priority or round robin scheme. In both cases the highest priority queue is the one with the lowest number. The queue priority is specified through the DRU_CFG_y[2-0] PRI field.
Whenever arbitration occurs if there is a TR in a fixed priority queue that TR always goes and the round robin queues are held off. If the fixed priority queues are empty then the round robin queues are arbitrated on a round robin basis, that is, each queue sends its specified number of transactions and then arbitration starts again. On the write side an arbitration ends if the read response has not been received for the next command when the current one completes.
The arbitration happens the last phase of a transfer chunk. A transfer chunk is defined as sending the number of read transactions specified by the DRU_CFG_y[23-16] CONSECUTIVE_TRANS field. After CONSECUTIVE_TRANS number of commands elapse the queue releases the bus and waits for the number of commands specified by the DRU_CFG_y[31-24] REARB_WAIT field before trying to request the bus and involve in arbitration again. Thus software can tune the data flow from each queue to prevent starvation.
If a queue is running and no other queues have a TR then the running one starts its next chunk without stopping. Each time arbitration is performed for round robin queues the queue with the next priority becomes the highest priority and the current one the lowest priority queue. If a fixed priority queue is active then the current round robin queue remains the highest priority one until the CONSECUTIVE_TRANS count expires or queue is empty.
The DMA bus QoS and order ID attributes for each queue can also be configured through the DRU_CFG_y[10-8] QOS and DRU_CFG_y[7-4] ORDERID fields.
Queue configuration must be done before setting up any channel as queue changes while channels are active can cause unknown behavior.