2 * QEMU model of the Configuration Frame Control module
4 * Copyright (C) 2023, Advanced Micro Devices, Inc.
6 * Written by Francisco Iglesias <francisco.iglesias@amd.com>
8 * SPDX-License-Identifier: GPL-2.0-or-later
11 * [1] Versal ACAP Technical Reference Manual,
12 * https://www.xilinx.com/support/documentation/architecture-manuals/am011-versal-acap-trm.pdf
14 * [2] Versal ACAP Register Reference,
15 * https://docs.xilinx.com/r/en-US/am012-versal-register-reference/CFRAME_REG-Module
17 #ifndef HW_MISC_XLNX_VERSAL_CFRAME_REG_H
18 #define HW_MISC_XLNX_VERSAL_CFRAME_REG_H
20 #include "hw/sysbus.h"
21 #include "hw/register.h"
22 #include "hw/misc/xlnx-cfi-if.h"
23 #include "hw/misc/xlnx-versal-cfu.h"
24 #include "qemu/fifo32.h"
26 #define TYPE_XLNX_VERSAL_CFRAME_REG "xlnx-cframe-reg"
27 OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalCFrameReg
, XLNX_VERSAL_CFRAME_REG
)
29 #define TYPE_XLNX_VERSAL_CFRAME_BCAST_REG "xlnx.cframe-bcast-reg"
30 OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalCFrameBcastReg
,
31 XLNX_VERSAL_CFRAME_BCAST_REG
)
34 * The registers in this module are 128 bits wide but it is ok to write
35 * and read them through 4 sequential 32 bit accesses (address[3:2] = 0,
39 FIELD(CRC
, CRC
, 0, 32)
44 FIELD(FAR0
, SEGMENT
, 23, 2)
45 FIELD(FAR0
, BLOCKTYPE
, 20, 3)
46 FIELD(FAR0
, FRAME_ADDR
, 0, 20)
51 FIELD(FAR_SFR0
, BLOCKTYPE
, 20, 3)
52 FIELD(FAR_SFR0
, FRAME_ADDR
, 0, 20)
61 FIELD(FRCNT0
, FRCNT
, 0, 32)
66 FIELD(CMD0
, CMD
, 0, 5)
75 FIELD(CTL
, PER_FRAME_CRC
, 0, 1)
79 REG32(CFRM_ISR0
, 0x150)
80 FIELD(CFRM_ISR0
, READ_BROADCAST_ERROR
, 21, 1)
81 FIELD(CFRM_ISR0
, CMD_MISSING_ERROR
, 20, 1)
82 FIELD(CFRM_ISR0
, RW_ROWOFF_ERROR
, 19, 1)
83 FIELD(CFRM_ISR0
, READ_REG_ADDR_ERROR
, 18, 1)
84 FIELD(CFRM_ISR0
, READ_BLK_TYPE_ERROR
, 17, 1)
85 FIELD(CFRM_ISR0
, READ_FRAME_ADDR_ERROR
, 16, 1)
86 FIELD(CFRM_ISR0
, WRITE_REG_ADDR_ERROR
, 15, 1)
87 FIELD(CFRM_ISR0
, WRITE_BLK_TYPE_ERROR
, 13, 1)
88 FIELD(CFRM_ISR0
, WRITE_FRAME_ADDR_ERROR
, 12, 1)
89 FIELD(CFRM_ISR0
, MFW_OVERRUN_ERROR
, 11, 1)
90 FIELD(CFRM_ISR0
, FAR_FIFO_UNDERFLOW
, 10, 1)
91 FIELD(CFRM_ISR0
, FAR_FIFO_OVERFLOW
, 9, 1)
92 FIELD(CFRM_ISR0
, PER_FRAME_SEQ_ERROR
, 8, 1)
93 FIELD(CFRM_ISR0
, CRC_ERROR
, 7, 1)
94 FIELD(CFRM_ISR0
, WRITE_OVERRUN_ERROR
, 6, 1)
95 FIELD(CFRM_ISR0
, READ_OVERRUN_ERROR
, 5, 1)
96 FIELD(CFRM_ISR0
, CMD_INTERRUPT_ERROR
, 4, 1)
97 FIELD(CFRM_ISR0
, WRITE_INTERRUPT_ERROR
, 3, 1)
98 FIELD(CFRM_ISR0
, READ_INTERRUPT_ERROR
, 2, 1)
99 FIELD(CFRM_ISR0
, SEU_CRC_ERROR
, 1, 1)
100 FIELD(CFRM_ISR0
, SEU_ECC_ERROR
, 0, 1)
101 REG32(CFRM_ISR1
, 0x154)
102 REG32(CFRM_ISR2
, 0x158)
103 REG32(CFRM_ISR3
, 0x15c)
104 REG32(CFRM_IMR0
, 0x160)
105 FIELD(CFRM_IMR0
, READ_BROADCAST_ERROR
, 21, 1)
106 FIELD(CFRM_IMR0
, CMD_MISSING_ERROR
, 20, 1)
107 FIELD(CFRM_IMR0
, RW_ROWOFF_ERROR
, 19, 1)
108 FIELD(CFRM_IMR0
, READ_REG_ADDR_ERROR
, 18, 1)
109 FIELD(CFRM_IMR0
, READ_BLK_TYPE_ERROR
, 17, 1)
110 FIELD(CFRM_IMR0
, READ_FRAME_ADDR_ERROR
, 16, 1)
111 FIELD(CFRM_IMR0
, WRITE_REG_ADDR_ERROR
, 15, 1)
112 FIELD(CFRM_IMR0
, WRITE_BLK_TYPE_ERROR
, 13, 1)
113 FIELD(CFRM_IMR0
, WRITE_FRAME_ADDR_ERROR
, 12, 1)
114 FIELD(CFRM_IMR0
, MFW_OVERRUN_ERROR
, 11, 1)
115 FIELD(CFRM_IMR0
, FAR_FIFO_UNDERFLOW
, 10, 1)
116 FIELD(CFRM_IMR0
, FAR_FIFO_OVERFLOW
, 9, 1)
117 FIELD(CFRM_IMR0
, PER_FRAME_SEQ_ERROR
, 8, 1)
118 FIELD(CFRM_IMR0
, CRC_ERROR
, 7, 1)
119 FIELD(CFRM_IMR0
, WRITE_OVERRUN_ERROR
, 6, 1)
120 FIELD(CFRM_IMR0
, READ_OVERRUN_ERROR
, 5, 1)
121 FIELD(CFRM_IMR0
, CMD_INTERRUPT_ERROR
, 4, 1)
122 FIELD(CFRM_IMR0
, WRITE_INTERRUPT_ERROR
, 3, 1)
123 FIELD(CFRM_IMR0
, READ_INTERRUPT_ERROR
, 2, 1)
124 FIELD(CFRM_IMR0
, SEU_CRC_ERROR
, 1, 1)
125 FIELD(CFRM_IMR0
, SEU_ECC_ERROR
, 0, 1)
126 REG32(CFRM_IMR1
, 0x164)
127 REG32(CFRM_IMR2
, 0x168)
128 REG32(CFRM_IMR3
, 0x16c)
129 REG32(CFRM_IER0
, 0x170)
130 FIELD(CFRM_IER0
, READ_BROADCAST_ERROR
, 21, 1)
131 FIELD(CFRM_IER0
, CMD_MISSING_ERROR
, 20, 1)
132 FIELD(CFRM_IER0
, RW_ROWOFF_ERROR
, 19, 1)
133 FIELD(CFRM_IER0
, READ_REG_ADDR_ERROR
, 18, 1)
134 FIELD(CFRM_IER0
, READ_BLK_TYPE_ERROR
, 17, 1)
135 FIELD(CFRM_IER0
, READ_FRAME_ADDR_ERROR
, 16, 1)
136 FIELD(CFRM_IER0
, WRITE_REG_ADDR_ERROR
, 15, 1)
137 FIELD(CFRM_IER0
, WRITE_BLK_TYPE_ERROR
, 13, 1)
138 FIELD(CFRM_IER0
, WRITE_FRAME_ADDR_ERROR
, 12, 1)
139 FIELD(CFRM_IER0
, MFW_OVERRUN_ERROR
, 11, 1)
140 FIELD(CFRM_IER0
, FAR_FIFO_UNDERFLOW
, 10, 1)
141 FIELD(CFRM_IER0
, FAR_FIFO_OVERFLOW
, 9, 1)
142 FIELD(CFRM_IER0
, PER_FRAME_SEQ_ERROR
, 8, 1)
143 FIELD(CFRM_IER0
, CRC_ERROR
, 7, 1)
144 FIELD(CFRM_IER0
, WRITE_OVERRUN_ERROR
, 6, 1)
145 FIELD(CFRM_IER0
, READ_OVERRUN_ERROR
, 5, 1)
146 FIELD(CFRM_IER0
, CMD_INTERRUPT_ERROR
, 4, 1)
147 FIELD(CFRM_IER0
, WRITE_INTERRUPT_ERROR
, 3, 1)
148 FIELD(CFRM_IER0
, READ_INTERRUPT_ERROR
, 2, 1)
149 FIELD(CFRM_IER0
, SEU_CRC_ERROR
, 1, 1)
150 FIELD(CFRM_IER0
, SEU_ECC_ERROR
, 0, 1)
151 REG32(CFRM_IER1
, 0x174)
152 REG32(CFRM_IER2
, 0x178)
153 REG32(CFRM_IER3
, 0x17c)
154 REG32(CFRM_IDR0
, 0x180)
155 FIELD(CFRM_IDR0
, READ_BROADCAST_ERROR
, 21, 1)
156 FIELD(CFRM_IDR0
, CMD_MISSING_ERROR
, 20, 1)
157 FIELD(CFRM_IDR0
, RW_ROWOFF_ERROR
, 19, 1)
158 FIELD(CFRM_IDR0
, READ_REG_ADDR_ERROR
, 18, 1)
159 FIELD(CFRM_IDR0
, READ_BLK_TYPE_ERROR
, 17, 1)
160 FIELD(CFRM_IDR0
, READ_FRAME_ADDR_ERROR
, 16, 1)
161 FIELD(CFRM_IDR0
, WRITE_REG_ADDR_ERROR
, 15, 1)
162 FIELD(CFRM_IDR0
, WRITE_BLK_TYPE_ERROR
, 13, 1)
163 FIELD(CFRM_IDR0
, WRITE_FRAME_ADDR_ERROR
, 12, 1)
164 FIELD(CFRM_IDR0
, MFW_OVERRUN_ERROR
, 11, 1)
165 FIELD(CFRM_IDR0
, FAR_FIFO_UNDERFLOW
, 10, 1)
166 FIELD(CFRM_IDR0
, FAR_FIFO_OVERFLOW
, 9, 1)
167 FIELD(CFRM_IDR0
, PER_FRAME_SEQ_ERROR
, 8, 1)
168 FIELD(CFRM_IDR0
, CRC_ERROR
, 7, 1)
169 FIELD(CFRM_IDR0
, WRITE_OVERRUN_ERROR
, 6, 1)
170 FIELD(CFRM_IDR0
, READ_OVERRUN_ERROR
, 5, 1)
171 FIELD(CFRM_IDR0
, CMD_INTERRUPT_ERROR
, 4, 1)
172 FIELD(CFRM_IDR0
, WRITE_INTERRUPT_ERROR
, 3, 1)
173 FIELD(CFRM_IDR0
, READ_INTERRUPT_ERROR
, 2, 1)
174 FIELD(CFRM_IDR0
, SEU_CRC_ERROR
, 1, 1)
175 FIELD(CFRM_IDR0
, SEU_ECC_ERROR
, 0, 1)
176 REG32(CFRM_IDR1
, 0x184)
177 REG32(CFRM_IDR2
, 0x188)
178 REG32(CFRM_IDR3
, 0x18c)
179 REG32(CFRM_ITR0
, 0x190)
180 FIELD(CFRM_ITR0
, READ_BROADCAST_ERROR
, 21, 1)
181 FIELD(CFRM_ITR0
, CMD_MISSING_ERROR
, 20, 1)
182 FIELD(CFRM_ITR0
, RW_ROWOFF_ERROR
, 19, 1)
183 FIELD(CFRM_ITR0
, READ_REG_ADDR_ERROR
, 18, 1)
184 FIELD(CFRM_ITR0
, READ_BLK_TYPE_ERROR
, 17, 1)
185 FIELD(CFRM_ITR0
, READ_FRAME_ADDR_ERROR
, 16, 1)
186 FIELD(CFRM_ITR0
, WRITE_REG_ADDR_ERROR
, 15, 1)
187 FIELD(CFRM_ITR0
, WRITE_BLK_TYPE_ERROR
, 13, 1)
188 FIELD(CFRM_ITR0
, WRITE_FRAME_ADDR_ERROR
, 12, 1)
189 FIELD(CFRM_ITR0
, MFW_OVERRUN_ERROR
, 11, 1)
190 FIELD(CFRM_ITR0
, FAR_FIFO_UNDERFLOW
, 10, 1)
191 FIELD(CFRM_ITR0
, FAR_FIFO_OVERFLOW
, 9, 1)
192 FIELD(CFRM_ITR0
, PER_FRAME_SEQ_ERROR
, 8, 1)
193 FIELD(CFRM_ITR0
, CRC_ERROR
, 7, 1)
194 FIELD(CFRM_ITR0
, WRITE_OVERRUN_ERROR
, 6, 1)
195 FIELD(CFRM_ITR0
, READ_OVERRUN_ERROR
, 5, 1)
196 FIELD(CFRM_ITR0
, CMD_INTERRUPT_ERROR
, 4, 1)
197 FIELD(CFRM_ITR0
, WRITE_INTERRUPT_ERROR
, 3, 1)
198 FIELD(CFRM_ITR0
, READ_INTERRUPT_ERROR
, 2, 1)
199 FIELD(CFRM_ITR0
, SEU_CRC_ERROR
, 1, 1)
200 FIELD(CFRM_ITR0
, SEU_ECC_ERROR
, 0, 1)
201 REG32(CFRM_ITR1
, 0x194)
202 REG32(CFRM_ITR2
, 0x198)
203 REG32(CFRM_ITR3
, 0x19c)
204 REG32(SEU_SYNDRM00
, 0x1a0)
205 REG32(SEU_SYNDRM01
, 0x1a4)
206 REG32(SEU_SYNDRM02
, 0x1a8)
207 REG32(SEU_SYNDRM03
, 0x1ac)
208 REG32(SEU_SYNDRM10
, 0x1b0)
209 REG32(SEU_SYNDRM11
, 0x1b4)
210 REG32(SEU_SYNDRM12
, 0x1b8)
211 REG32(SEU_SYNDRM13
, 0x1bc)
212 REG32(SEU_SYNDRM20
, 0x1c0)
213 REG32(SEU_SYNDRM21
, 0x1c4)
214 REG32(SEU_SYNDRM22
, 0x1c8)
215 REG32(SEU_SYNDRM23
, 0x1cc)
216 REG32(SEU_SYNDRM30
, 0x1d0)
217 REG32(SEU_SYNDRM31
, 0x1d4)
218 REG32(SEU_SYNDRM32
, 0x1d8)
219 REG32(SEU_SYNDRM33
, 0x1dc)
220 REG32(SEU_VIRTUAL_SYNDRM0
, 0x1e0)
221 REG32(SEU_VIRTUAL_SYNDRM1
, 0x1e4)
222 REG32(SEU_VIRTUAL_SYNDRM2
, 0x1e8)
223 REG32(SEU_VIRTUAL_SYNDRM3
, 0x1ec)
224 REG32(SEU_CRC0
, 0x1f0)
225 REG32(SEU_CRC1
, 0x1f4)
226 REG32(SEU_CRC2
, 0x1f8)
227 REG32(SEU_CRC3
, 0x1fc)
228 REG32(CFRAME_FAR_BOT0
, 0x200)
229 REG32(CFRAME_FAR_BOT1
, 0x204)
230 REG32(CFRAME_FAR_BOT2
, 0x208)
231 REG32(CFRAME_FAR_BOT3
, 0x20c)
232 REG32(CFRAME_FAR_TOP0
, 0x210)
233 REG32(CFRAME_FAR_TOP1
, 0x214)
234 REG32(CFRAME_FAR_TOP2
, 0x218)
235 REG32(CFRAME_FAR_TOP3
, 0x21c)
236 REG32(LAST_FRAME_BOT0
, 0x220)
237 FIELD(LAST_FRAME_BOT0
, BLOCKTYPE1_LAST_FRAME_LSB
, 20, 12)
238 FIELD(LAST_FRAME_BOT0
, BLOCKTYPE0_LAST_FRAME
, 0, 20)
239 REG32(LAST_FRAME_BOT1
, 0x224)
240 FIELD(LAST_FRAME_BOT1
, BLOCKTYPE3_LAST_FRAME_LSB
, 28, 4)
241 FIELD(LAST_FRAME_BOT1
, BLOCKTYPE2_LAST_FRAME
, 8, 20)
242 FIELD(LAST_FRAME_BOT1
, BLOCKTYPE1_LAST_FRAME_MSB
, 0, 8)
243 REG32(LAST_FRAME_BOT2
, 0x228)
244 FIELD(LAST_FRAME_BOT2
, BLOCKTYPE3_LAST_FRAME_MSB
, 0, 16)
245 REG32(LAST_FRAME_BOT3
, 0x22c)
246 REG32(LAST_FRAME_TOP0
, 0x230)
247 FIELD(LAST_FRAME_TOP0
, BLOCKTYPE5_LAST_FRAME_LSB
, 20, 12)
248 FIELD(LAST_FRAME_TOP0
, BLOCKTYPE4_LAST_FRAME
, 0, 20)
249 REG32(LAST_FRAME_TOP1
, 0x234)
250 FIELD(LAST_FRAME_TOP1
, BLOCKTYPE6_LAST_FRAME
, 8, 20)
251 FIELD(LAST_FRAME_TOP1
, BLOCKTYPE5_LAST_FRAME_MSB
, 0, 8)
252 REG32(LAST_FRAME_TOP2
, 0x238)
253 REG32(LAST_FRAME_TOP3
, 0x23c)
255 #define CFRAME_REG_R_MAX (R_LAST_FRAME_TOP3 + 1)
257 #define FRAME_NUM_QWORDS 25
258 #define FRAME_NUM_WORDS (FRAME_NUM_QWORDS * 4) /* 25 * 128 bits */
260 typedef struct XlnxCFrame
{
261 uint32_t data
[FRAME_NUM_WORDS
];
264 struct XlnxVersalCFrameReg
{
265 SysBusDevice parent_obj
;
267 MemoryRegion iomem_fdri
;
268 qemu_irq irq_cfrm_imr
;
271 uint32_t wfifo
[WFIFO_SZ
];
273 uint32_t regs
[CFRAME_REG_R_MAX
];
274 RegisterInfo regs_info
[CFRAME_REG_R_MAX
];
285 uint32_t blktype_num_frames
[7];
290 struct XlnxVersalCFrameBcastReg
{
291 SysBusDevice parent_obj
;
292 MemoryRegion iomem_reg
;
293 MemoryRegion iomem_fdri
;
296 uint32_t wfifo
[WFIFO_SZ
];
299 XlnxCfiIf
*cframe
[15];