@@ -12,12 +12,21 @@ The following Broadcast CCCs are currently supported by the core (all required B
1212* DISEC (R) - Disable Events Command
1313* SETMWL (R) - Set Max Write Length
1414* SETMRL (R) - Set Max Read Length
15- * SETAASA (O) - Set All Addresses to Static Adresses
15+ * SETAASA (O) - Set All Addresses to Static Addresses
1616* ENTDAA (R) - Enter Dynamic Address Assignment
17- * RSTDAA (R) - Direct Reset Dynamic Address Assignment - this direct CCC is deprecated, the core NACKs this command as per the spec
17+ * RSTDAA (R) - Reset Dynamic Address Assignment
1818* RSTACT (R) - Target Reset Action
1919 * Broadcast (Format 1) supports defining bytes 0x0, 0x1 and 0x2
2020
21+ The following Broadcast CCCs are recognized but not actively handled (the core ACKs or NACKs as appropriate per the specification):
22+
23+ * ENTAS0-ENTAS3 - Enter Activity State (acknowledged, no behavioral change)
24+ * ENTHDR0-ENTHDR7 - Enter HDR Mode (triggers HDR mode entry; HDR data transfer is not supported)
25+ * ENDXFER - Data Transfer Ending Procedure Control
26+ * SETBUSCON - Set Bus Context
27+ * DEFGRPA / RSTGRPA - Group Address (not supported, NACKed)
28+ * MLANE - Multi-Lane (not supported, NACKed)
29+
2130## Direct CCCs
2231
2332The following Direct CCCs are currently supported by the core (all required Direct CCCs, plus several optional/conditional ones):
@@ -30,14 +39,89 @@ The following Direct CCCs are currently supported by the core (all required Dire
3039* SETMWL (R) - Set Max Write Length
3140* SETMRL (R) - Set Max Read Length
3241* GETMWL (R) - Get Max Write Length
33- * GETMRL (R) - Set Max Read Length
42+ * GETMRL (R) - Get Max Read Length
3443* GETPID (C) - Get Provisioned ID
3544* GETBCR (C) - Get Bus Characteristics Register
3645* GETDCR (C) - Get Device Characteristics Register
3746* GETSTATUS (R) - Get Device Status
3847 * The two-byte format (Format 1)
3948* GETCAPS (R) - Get Optional Feature Capabilities
40- * Without defining byte ( Format 1)
49+ * Without defining byte (Format 1)
50+ * With defining byte 0x93
4151* RSTACT (R) - Target Reset Action
4252 * Direct Write (Format 2) supports defining bytes 0x0, 0x1 and 0x2
43- * Direct Read (Format 3) supports defining bytes 0x81 and 0x82 and returns the 0xFF as recovery timing
53+ * Direct Read (Format 3) supports defining bytes 0x81, 0x82, and 0x84 and returns 0xFF as recovery timing
54+ * ENDXFER - Data Transfer Ending Procedure Control
55+
56+ ## CCCs That Update Registers Without Firmware Notification
57+
58+ The following CCCs autonomously update internal registers without generating an
59+ interrupt to notify firmware. Firmware should poll these registers if current
60+ values are needed:
61+
62+ | CCC | Register Updated | Notes |
63+ |-----|-----------------|-------|
64+ | SETDASA | `STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR` / `DYNAMIC_ADDR_VALID` | Sets dynamic address (main or virtual) |
65+ | SETNEWDA | `STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR` / `DYNAMIC_ADDR_VALID` | Assigns a new dynamic address (main or virtual) |
66+ | SETAASA | `STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR` / `DYNAMIC_ADDR_VALID` | Copies static address to dynamic address (main and/or virtual) |
67+ | RSTDAA | `STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR` / `DYNAMIC_ADDR_VALID` | Clears dynamic address and valid bit (main and virtual) |
68+ | SETMRL (Broadcast/Direct) | `STBY_CR_MRL.MRL` | Max Read Length; not enforced in hardware |
69+ | SETMRL (with IBI length) | `STBY_CR_MRL.IBIL` | IBI data length |
70+ | SETMWL (Broadcast/Direct) | `STBY_CR_MWL.MWL` | Max Write Length; not enforced in hardware |
71+ | RSTACT | `STBY_CR_CCC_CONFIG_RSTACT_PARAMS.RST_ACTION` | Reset action level (defaults to 0x1 when no RSTACT is active) |
72+ | ENEC | `TTI.CONTROL.IBI_EN`, `CRR_EN`, `HJ_EN` | Enables the corresponding event |
73+ | DISEC | `TTI.CONTROL.IBI_EN`, `CRR_EN`, `HJ_EN` | Disables the corresponding event |
74+
75+ ```{note}
76+ MRL and MWL values are informational only. The hardware does not enforce these
77+ limits on Private Read or Private Write transfers. See {doc}`firmware_guide` for
78+ details on firmware responsibilities.
79+ ```
80+
81+ ## Multi-Byte CCC Register Atomicity
82+
83+ Several Direct GET CCCs return multi-byte values. The CCC state machine
84+ transmits these byte-by-byte, selecting each byte from the source signal
85+ combinationally as it is needed. There is no snapshot or shadow register;
86+ the source is re-read on every byte. If the underlying CSR is modified
87+ mid-transfer, remaining bytes will reflect the new value while
88+ already-transmitted bytes retain the old value.
89+
90+ | CCC | Bytes | Source | Updated By |
91+ |-----|-------|--------|------------|
92+ | GETBCR | 1 | `STBY_CR_DEVICE_CHAR.BCR_*` | FW |
93+ | GETDCR | 1 | `STBY_CR_DEVICE_CHAR.DCR` | FW |
94+ | GETSTATUS | 2 | `TTI.INTERRUPT_STATUS`, `TTI.STATUS` | HW |
95+ | GETMWL | 2 | Internal flop | SETMWL CCC |
96+ | GETMRL | 3 | Internal flop | SETMRL CCC |
97+ | GETPID | 6 | `STBY_CR_DEVICE_CHAR.PID_HI` + `STBY_CR_DEVICE_PID_LO.PID_LO` | FW |
98+
99+ **GETPID**: The 48-bit PID is assembled combinationally from two CSR
100+ registers (`STBY_CR_DEVICE_CHAR` and `STBY_CR_DEVICE_PID_LO`). If firmware
101+ writes either register while a GETPID CCC is in progress, the byte being
102+ transmitted in that cycle and all subsequent bytes will use the new register
103+ value. Firmware should write both PID registers before the Target receives
104+ a dynamic address (before ENTDAA / SETDASA / SETAASA), since GETPID is
105+ only issued after address assignment.
106+
107+ **GETMWL / GETMRL**: These read internal flops that are only written by the
108+ SETMWL / SETMRL CCC handler. Since only one CCC can be active on the bus at
109+ a time, GET and SET cannot overlap. These registers are read-only to firmware
110+ (`sw = r`).
111+
112+ For SET CCCs, **SETMRL** commits MRL (bytes 0-1) and IBIL (byte 2) to
113+ `STBY_CR_MRL` on separate clock cycles. A firmware read of `STBY_CR_MRL`
114+ between those two updates sees the new MRL with the stale IBIL. **SETMWL**
115+ commits both MWL bytes to `STBY_CR_MWL` in a single cycle.
116+
117+ ## CCC Error Handling
118+
119+ The core detects errors during CCC processing:
120+
121+ * **TE1**: CCC command code parity error
122+ * **TE5**: Wrong R/W direction for a Direct CCC (e.g., SET command with Read)
123+ * **Framing Error**: SETDASA/SETNEWDA padding bit error (Bit[0] != 0)
124+
125+ These errors are reported through the `TTI.TARGET_ERR_INTR_STATUS` register
126+ and the `TTI.STATUS.PROTOCOL_ERROR` bit (readable via GETSTATUS CCC).
127+ See {doc}`error_handling` for full details.
0 commit comments