This module validates the incoming command (SQE) from the arbitration module and does the following checks:
- PRP1/2 offset error check
- Invalid field in command
Once the command is validated validation, it is pushed to the local command
buffer pool. If the command requires additional PRP entries, the required information
(PRP list pointer) is pushed to PRP fetch manager module for fetching the remaining PRP
data pointers. Once the first set of PRPs are fetched, the SQE command is modified and
pushed on the cmd_m_axis
towards the hardware
application. Each command is appended with the UID. In case any error is encountered,
the same is reported to the hardware/software application. The application may then
prepare an error completion (CQE) and post it to the host using the NVMe TC IP. The
format of the entry provided to the hardware/software application is shown in the
following table.
Bitwidth | Field | Size (Bytes) | Description |
---|---|---|---|
[511:0] | SQE | 64 | Standard NVMe Command |
[527:512] | UID | 2 | NVMe TC level unique ID, used to identify PRP buffer. Note: 16’hFFFF is used for no PRP list
case.
|
[543:528] | SQID | 2 | Submission Queue ID |
[559:544] | FNID | 2 | Physical/Virtual Function ID |
[575:560] | ERR_CODE | 2 | NVMe Command Validation Error Status |
The error code decoding is provided in the following table.
ERR_CODE | Description |
---|---|
16’h0002 | Invalid Field in Command: Asserted when host submits a command that exceeds MDTS transfer size or in case of an invalid Namespace ID in the command. |
16’h0006 | Internal Error: Error while fetching Submission Queue entry from QDMA/Host |
16’h0013 | PRP Offset Invalid: The Offset field for a PRP entry is invalid. This may occur when there is a PRP entry with a non-zero offset after the first entry. |