This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

RapidIO ACKIDs: why are the so many outstanding?



Hi

I am trying to understand the ACKID protocol. According to the Rapid IO Interconnect Specification Rev 2.1, 8/2009,

http://www.rapidio.org/specs/current

the inbound and outstanding should only be one apart.

. An external processing element write of a

command to the link-request register with a Part I: Input/Output Logical Specification

maintenance write transaction causes an aligned link-request control symbol to be issued

onto the output port of the device, but only one link-request can be outstanding on a link at

a time. The device that is linked to the sending device shall respond with an aligned

link-response control symbol if the link-request command required it to do so.

Below is my output from the C6472 when doing SRIO read and writes. Note how the  SP_ACKID_STAT register OUTSTANDING ACKID starts out close to the INBOUND and then climbs higher than INBOUND. I put in a 1 sec delay between transactions thinking that this was a delay issue with the target SRIO node (Altera FPGA) and the result was the same.

Is this normal behavior to have the ACKIDs more than 1 apart? It doesn't seem to match the TI SRIO users guide sprue13h.pdf Appendic A.

And the definition of the OUTSTANDING_ACKID in the RapidIO Part IV spec says "A set bit indicastes that the corresponding ACKID value has been used to send a packet...but the corresponding ack ctrl sym has not been received. They have 8 bits defined. So obviously the Outstanding AckID definition in the spec is different than the TI SRIO guide.  Could you explain what it means in TI's context?

Also, why does the LINK_STATUS field continually have 0x10 below (SP_LM_RESP)? According to the Rapid IO Interconnect Specification Part IV Table 4-7 link_status Field Definition, its only supposed to be 4 bits. So if b4 is bogus, then the status is 0x0, which is a "reserved" response according to the table. Any thoughts on what the link_status should be since the SP_ERR_STAT register does not indicate there are any transfer errors.

Furthermore, the link_response control symbol that contains the link_status only has 4 bits allocated to link_status.

Could it be that the field is ~(link_status) - the control symbol has a bit-wise inversion in the later 16 bits.. That still wouldn't make sense though since b01111 is "Working properly, expecting ackID 7".

Cheers

************C6272 output***********************************

Link is UP!

    SP_LM_RESP (0x2d01144) = 0x80000010
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x0
        ACKIDS: INBOUND = 0x0, OUTSTANDING = 0x0, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x80000010
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x100
        ACKIDS: INBOUND = 0x0, OUTSTANDING = 0x1, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x1000200
        ACKIDS: INBOUND = 0x1, OUTSTANDING = 0x2, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x1000300
        ACKIDS: INBOUND = 0x1, OUTSTANDING = 0x3, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x2000400
        ACKIDS: INBOUND = 0x2, OUTSTANDING = 0x4, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x2000500
        ACKIDS: INBOUND = 0x2, OUTSTANDING = 0x5, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x3000600
        ACKIDS: INBOUND = 0x3, OUTSTANDING = 0x6, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x3000700
        ACKIDS: INBOUND = 0x3, OUTSTANDING = 0x7, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x4000800
        ACKIDS: INBOUND = 0x4, OUTSTANDING = 0x8, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x4000900
        ACKIDS: INBOUND = 0x4, OUTSTANDING = 0x9, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x5000a00
        ACKIDS: INBOUND = 0x5, OUTSTANDING = 0xa, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x5000b00
        ACKIDS: INBOUND = 0x5, OUTSTANDING = 0xb, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x6000c00
        ACKIDS: INBOUND = 0x6, OUTSTANDING = 0xc, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x6000d00
        ACKIDS: INBOUND = 0x6, OUTSTANDING = 0xd, OUTBOUND = 0x0
Start srio_read
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x7000e00
        ACKIDS: INBOUND = 0x7, OUTSTANDING = 0xe, OUTBOUND = 0x0
Start srio_write
    SP_LM_RESP (0x2d01144) = 0x10
        ACKID_STATUS = 0x0, LINK_STATUS = 0x10
    SP_ACKID_STAT (0x2d01148) = 0x7000f00
        ACKIDS: INBOUND = 0x7, OUTSTANDING = 0xf, OUTBOUND = 0x0

and awhile later we get wrap around (I cut out all the other printfs)

        ACKIDS: INBOUND = 0xf, OUTSTANDING = 0x1e, OUTBOUND = 0x0
        ACKIDS: INBOUND = 0xf, OUTSTANDING = 0x1f, OUTBOUND = 0x0
        ACKIDS: INBOUND = 0x10, OUTSTANDING = 0x0, OUTBOUND = 0x0

        ACKIDS: INBOUND = 0x10, OUTSTANDING = 0x1, OUTBOUND = 0x0

        ACKIDS: INBOUND = 0x11, OUTSTANDING = 0x2, OUTBOUND = 0x0
        ACKIDS: INBOUND = 0x11, OUTSTANDING = 0x3, OUTBOUND = 0x0

 

  • This likely has nothing to do with this issue, but for others who are grepping ACKID and noticed that the OUTBOUND never changes from zero, they may want to know about this silicon bug

    http://www.ti.com/lit/pdf/sprz300

    Advisory 22 SRIO OUTBOUND_ACKID Field Not Read Correctly
    Revision(s) Affected: 2.1, 1.2, 1.1, 1.0
    Details: The OUTBOUND_ACKID field of the RIO_SP(n)_ACKID_STAT register should be
    updated by hardware each time a packet is sent out. The value should reflect the ACKID
    value to be used on the next transmit packet. This field is being updated by the hardware
    as expected. The field can also be written by the software and these writes also
    succeed. However, a hardware error prevents this field from being read. The
    OUTBOUND_ACKID always reads as zero. This problem does not cause any impact to
    link operation.
    Workaround: There is no workaround for this advisory.