1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2016 Cavium, Inc. 4 */ 5 6 #ifndef __CPT_HW_TYPES_H 7 #define __CPT_HW_TYPES_H 8 9 #include "cpt_common.h" 10 11 /** 12 * Enumeration cpt_comp_e 13 * 14 * CPT Completion Enumeration 15 * Enumerates the values of CPT_RES_S[COMPCODE]. 16 */ 17 enum cpt_comp_e { 18 CPT_COMP_E_NOTDONE = 0x00, 19 CPT_COMP_E_GOOD = 0x01, 20 CPT_COMP_E_FAULT = 0x02, 21 CPT_COMP_E_SWERR = 0x03, 22 CPT_COMP_E_LAST_ENTRY = 0xFF 23 }; 24 25 /** 26 * Structure cpt_inst_s 27 * 28 * CPT Instruction Structure 29 * This structure specifies the instruction layout. Instructions are 30 * stored in memory as little-endian unless CPT()_PF_Q()_CTL[INST_BE] is set. 31 * cpt_inst_s_s 32 * Word 0 33 * doneint:1 Done interrupt. 34 * 0 = No interrupts related to this instruction. 35 * 1 = When the instruction completes, CPT()_VQ()_DONE[DONE] will be 36 * incremented,and based on the rules described there an interrupt may 37 * occur. 38 * Word 1 39 * res_addr [127: 64] Result IOVA. 40 * If nonzero, specifies where to write CPT_RES_S. 41 * If zero, no result structure will be written. 42 * Address must be 16-byte aligned. 43 * Bits <63:49> are ignored by hardware; software should use a 44 * sign-extended bit <48> for forward compatibility. 45 * Word 2 46 * grp:10 [171:162] If [WQ_PTR] is nonzero, the SSO guest-group to use when 47 * CPT submits work SSO. 48 * For the SSO to not discard the add-work request, FPA_PF_MAP() must map 49 * [GRP] and CPT()_PF_Q()_GMCTL[GMID] as valid. 50 * tt:2 [161:160] If [WQ_PTR] is nonzero, the SSO tag type to use when CPT 51 * submits work to SSO 52 * tag:32 [159:128] If [WQ_PTR] is nonzero, the SSO tag to use when CPT 53 * submits work to SSO. 54 * Word 3 55 * wq_ptr [255:192] If [WQ_PTR] is nonzero, it is a pointer to a 56 * work-queue entry that CPT submits work to SSO after all context, 57 * output data, and result write operations are visible to other 58 * CNXXXX units and the cores. Bits <2:0> must be zero. 59 * Bits <63:49> are ignored by hardware; software should 60 * use a sign-extended bit <48> for forward compatibility. 61 * Internal: 62 * Bits <63:49>, <2:0> are ignored by hardware, treated as always 0x0. 63 * Word 4 64 * ei0; [319:256] Engine instruction word 0. Passed to the AE/SE. 65 * Word 5 66 * ei1; [383:320] Engine instruction word 1. Passed to the AE/SE. 67 * Word 6 68 * ei2; [447:384] Engine instruction word 1. Passed to the AE/SE. 69 * Word 7 70 * ei3; [511:448] Engine instruction word 1. Passed to the AE/SE. 71 * 72 */ 73 union cpt_inst_s { 74 u64 u[8]; 75 struct cpt_inst_s_s { 76 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 77 u64 reserved_17_63:47; 78 u64 doneint:1; 79 u64 reserved_0_1:16; 80 #else /* Word 0 - Little Endian */ 81 u64 reserved_0_15:16; 82 u64 doneint:1; 83 u64 reserved_17_63:47; 84 #endif /* Word 0 - End */ 85 u64 res_addr; 86 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 2 - Big Endian */ 87 u64 reserved_172_19:20; 88 u64 grp:10; 89 u64 tt:2; 90 u64 tag:32; 91 #else /* Word 2 - Little Endian */ 92 u64 tag:32; 93 u64 tt:2; 94 u64 grp:10; 95 u64 reserved_172_191:20; 96 #endif /* Word 2 - End */ 97 u64 wq_ptr; 98 u64 ei0; 99 u64 ei1; 100 u64 ei2; 101 u64 ei3; 102 } s; 103 }; 104 105 /** 106 * Structure cpt_res_s 107 * 108 * CPT Result Structure 109 * The CPT coprocessor writes the result structure after it completes a 110 * CPT_INST_S instruction. The result structure is exactly 16 bytes, and 111 * each instruction completion produces exactly one result structure. 112 * 113 * This structure is stored in memory as little-endian unless 114 * CPT()_PF_Q()_CTL[INST_BE] is set. 115 * cpt_res_s_s 116 * Word 0 117 * doneint:1 [16:16] Done interrupt. This bit is copied from the 118 * corresponding instruction's CPT_INST_S[DONEINT]. 119 * compcode:8 [7:0] Indicates completion/error status of the CPT coprocessor 120 * for the associated instruction, as enumerated by CPT_COMP_E. 121 * Core software may write the memory location containing [COMPCODE] to 122 * 0x0 before ringing the doorbell, and then poll for completion by 123 * checking for a nonzero value. 124 * Once the core observes a nonzero [COMPCODE] value in this case,the CPT 125 * coprocessor will have also completed L2/DRAM write operations. 126 * Word 1 127 * reserved 128 * 129 */ 130 union cpt_res_s { 131 u64 u[2]; 132 struct cpt_res_s_s { 133 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 134 u64 reserved_17_63:47; 135 u64 doneint:1; 136 u64 reserved_8_15:8; 137 u64 compcode:8; 138 #else /* Word 0 - Little Endian */ 139 u64 compcode:8; 140 u64 reserved_8_15:8; 141 u64 doneint:1; 142 u64 reserved_17_63:47; 143 #endif /* Word 0 - End */ 144 u64 reserved_64_127; 145 } s; 146 }; 147 148 /** 149 * Register (NCB) cpt#_pf_bist_status 150 * 151 * CPT PF Control Bist Status Register 152 * This register has the BIST status of memories. Each bit is the BIST result 153 * of an individual memory (per bit, 0 = pass and 1 = fail). 154 * cptx_pf_bist_status_s 155 * Word0 156 * bstatus [29:0](RO/H) BIST status. One bit per memory, enumerated by 157 * CPT_RAMS_E. 158 */ 159 union cptx_pf_bist_status { 160 u64 u; 161 struct cptx_pf_bist_status_s { 162 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 163 u64 reserved_30_63:34; 164 u64 bstatus:30; 165 #else /* Word 0 - Little Endian */ 166 u64 bstatus:30; 167 u64 reserved_30_63:34; 168 #endif /* Word 0 - End */ 169 } s; 170 }; 171 172 /** 173 * Register (NCB) cpt#_pf_constants 174 * 175 * CPT PF Constants Register 176 * This register contains implementation-related parameters of CPT in CNXXXX. 177 * cptx_pf_constants_s 178 * Word 0 179 * reserved_40_63:24 [63:40] Reserved. 180 * epcis:8 [39:32](RO) Number of EPCI busses. 181 * grps:8 [31:24](RO) Number of engine groups implemented. 182 * ae:8 [23:16](RO/H) Number of AEs. In CNXXXX, for CPT0 returns 0x0, 183 * for CPT1 returns 0x18, or less if there are fuse-disables. 184 * se:8 [15:8](RO/H) Number of SEs. In CNXXXX, for CPT0 returns 0x30, 185 * or less if there are fuse-disables, for CPT1 returns 0x0. 186 * vq:8 [7:0](RO) Number of VQs. 187 */ 188 union cptx_pf_constants { 189 u64 u; 190 struct cptx_pf_constants_s { 191 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 192 u64 reserved_40_63:24; 193 u64 epcis:8; 194 u64 grps:8; 195 u64 ae:8; 196 u64 se:8; 197 u64 vq:8; 198 #else /* Word 0 - Little Endian */ 199 u64 vq:8; 200 u64 se:8; 201 u64 ae:8; 202 u64 grps:8; 203 u64 epcis:8; 204 u64 reserved_40_63:24; 205 #endif /* Word 0 - End */ 206 } s; 207 }; 208 209 /** 210 * Register (NCB) cpt#_pf_exe_bist_status 211 * 212 * CPT PF Engine Bist Status Register 213 * This register has the BIST status of each engine. Each bit is the 214 * BIST result of an individual engine (per bit, 0 = pass and 1 = fail). 215 * cptx_pf_exe_bist_status_s 216 * Word0 217 * reserved_48_63:16 [63:48] reserved 218 * bstatus:48 [47:0](RO/H) BIST status. One bit per engine. 219 * 220 */ 221 union cptx_pf_exe_bist_status { 222 u64 u; 223 struct cptx_pf_exe_bist_status_s { 224 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 225 u64 reserved_48_63:16; 226 u64 bstatus:48; 227 #else /* Word 0 - Little Endian */ 228 u64 bstatus:48; 229 u64 reserved_48_63:16; 230 #endif /* Word 0 - End */ 231 } s; 232 }; 233 234 /** 235 * Register (NCB) cpt#_pf_q#_ctl 236 * 237 * CPT Queue Control Register 238 * This register configures queues. This register should be changed only 239 * when quiescent (see CPT()_VQ()_INPROG[INFLIGHT]). 240 * cptx_pf_qx_ctl_s 241 * Word0 242 * reserved_60_63:4 [63:60] reserved. 243 * aura:12; [59:48](R/W) Guest-aura for returning this queue's 244 * instruction-chunk buffers to FPA. Only used when [INST_FREE] is set. 245 * For the FPA to not discard the request, FPA_PF_MAP() must map 246 * [AURA] and CPT()_PF_Q()_GMCTL[GMID] as valid. 247 * reserved_45_47:3 [47:45] reserved. 248 * size:13 [44:32](R/W) Command-buffer size, in number of 64-bit words per 249 * command buffer segment. Must be 8*n + 1, where n is the number of 250 * instructions per buffer segment. 251 * reserved_11_31:21 [31:11] Reserved. 252 * cont_err:1 [10:10](R/W) Continue on error. 253 * 0 = When CPT()_VQ()_MISC_INT[NWRP], CPT()_VQ()_MISC_INT[IRDE] or 254 * CPT()_VQ()_MISC_INT[DOVF] are set by hardware or software via 255 * CPT()_VQ()_MISC_INT_W1S, then CPT()_VQ()_CTL[ENA] is cleared. Due to 256 * pipelining, additional instructions may have been processed between the 257 * instruction causing the error and the next instruction in the disabled 258 * queue (the instruction at CPT()_VQ()_SADDR). 259 * 1 = Ignore errors and continue processing instructions. 260 * For diagnostic use only. 261 * inst_free:1 [9:9](R/W) Instruction FPA free. When set, when CPT reaches the 262 * end of an instruction chunk, that chunk will be freed to the FPA. 263 * inst_be:1 [8:8](R/W) Instruction big-endian control. When set, instructions, 264 * instruction next chunk pointers, and result structures are stored in 265 * big-endian format in memory. 266 * iqb_ldwb:1 [7:7](R/W) Instruction load don't write back. 267 * 0 = The hardware issues NCB transient load (LDT) towards the cache, 268 * which if the line hits and it is dirty will cause the line to be 269 * written back before being replaced. 270 * 1 = The hardware issues NCB LDWB read-and-invalidate command towards 271 * the cache when fetching the last word of instructions; as a result the 272 * line will not be written back when replaced. This improves 273 * performance, but software must not read the instructions after they are 274 * posted to the hardware. Reads that do not consume the last word of a 275 * cache line always use LDI. 276 * reserved_4_6:3 [6:4] Reserved. 277 * grp:3; [3:1](R/W) Engine group. 278 * pri:1; [0:0](R/W) Queue priority. 279 * 1 = This queue has higher priority. Round-robin between higher 280 * priority queues. 281 * 0 = This queue has lower priority. Round-robin between lower 282 * priority queues. 283 */ 284 union cptx_pf_qx_ctl { 285 u64 u; 286 struct cptx_pf_qx_ctl_s { 287 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 288 u64 reserved_60_63:4; 289 u64 aura:12; 290 u64 reserved_45_47:3; 291 u64 size:13; 292 u64 reserved_11_31:21; 293 u64 cont_err:1; 294 u64 inst_free:1; 295 u64 inst_be:1; 296 u64 iqb_ldwb:1; 297 u64 reserved_4_6:3; 298 u64 grp:3; 299 u64 pri:1; 300 #else /* Word 0 - Little Endian */ 301 u64 pri:1; 302 u64 grp:3; 303 u64 reserved_4_6:3; 304 u64 iqb_ldwb:1; 305 u64 inst_be:1; 306 u64 inst_free:1; 307 u64 cont_err:1; 308 u64 reserved_11_31:21; 309 u64 size:13; 310 u64 reserved_45_47:3; 311 u64 aura:12; 312 u64 reserved_60_63:4; 313 #endif /* Word 0 - End */ 314 } s; 315 }; 316 317 /** 318 * Register (NCB) cpt#_vq#_saddr 319 * 320 * CPT Queue Starting Buffer Address Registers 321 * These registers set the instruction buffer starting address. 322 * cptx_vqx_saddr_s 323 * Word0 324 * reserved_49_63:15 [63:49] Reserved. 325 * ptr:43 [48:6](R/W/H) Instruction buffer IOVA <48:6> (64-byte aligned). 326 * When written, it is the initial buffer starting address; when read, 327 * it is the next read pointer to be requested from L2C. The PTR field 328 * is overwritten with the next pointer each time that the command buffer 329 * segment is exhausted. New commands will then be read from the newly 330 * specified command buffer pointer. 331 * reserved_0_5:6 [5:0] Reserved. 332 * 333 */ 334 union cptx_vqx_saddr { 335 u64 u; 336 struct cptx_vqx_saddr_s { 337 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 338 u64 reserved_49_63:15; 339 u64 ptr:43; 340 u64 reserved_0_5:6; 341 #else /* Word 0 - Little Endian */ 342 u64 reserved_0_5:6; 343 u64 ptr:43; 344 u64 reserved_49_63:15; 345 #endif /* Word 0 - End */ 346 } s; 347 }; 348 349 /** 350 * Register (NCB) cpt#_vq#_misc_ena_w1s 351 * 352 * CPT Queue Misc Interrupt Enable Set Register 353 * This register sets interrupt enable bits. 354 * cptx_vqx_misc_ena_w1s_s 355 * Word0 356 * reserved_5_63:59 [63:5] Reserved. 357 * swerr:1 [4:4](R/W1S/H) Reads or sets enable for 358 * CPT(0..1)_VQ(0..63)_MISC_INT[SWERR]. 359 * nwrp:1 [3:3](R/W1S/H) Reads or sets enable for 360 * CPT(0..1)_VQ(0..63)_MISC_INT[NWRP]. 361 * irde:1 [2:2](R/W1S/H) Reads or sets enable for 362 * CPT(0..1)_VQ(0..63)_MISC_INT[IRDE]. 363 * dovf:1 [1:1](R/W1S/H) Reads or sets enable for 364 * CPT(0..1)_VQ(0..63)_MISC_INT[DOVF]. 365 * mbox:1 [0:0](R/W1S/H) Reads or sets enable for 366 * CPT(0..1)_VQ(0..63)_MISC_INT[MBOX]. 367 * 368 */ 369 union cptx_vqx_misc_ena_w1s { 370 u64 u; 371 struct cptx_vqx_misc_ena_w1s_s { 372 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 373 u64 reserved_5_63:59; 374 u64 swerr:1; 375 u64 nwrp:1; 376 u64 irde:1; 377 u64 dovf:1; 378 u64 mbox:1; 379 #else /* Word 0 - Little Endian */ 380 u64 mbox:1; 381 u64 dovf:1; 382 u64 irde:1; 383 u64 nwrp:1; 384 u64 swerr:1; 385 u64 reserved_5_63:59; 386 #endif /* Word 0 - End */ 387 } s; 388 }; 389 390 /** 391 * Register (NCB) cpt#_vq#_doorbell 392 * 393 * CPT Queue Doorbell Registers 394 * Doorbells for the CPT instruction queues. 395 * cptx_vqx_doorbell_s 396 * Word0 397 * reserved_20_63:44 [63:20] Reserved. 398 * dbell_cnt:20 [19:0](R/W/H) Number of instruction queue 64-bit words to add 399 * to the CPT instruction doorbell count. Readback value is the 400 * current number of pending doorbell requests. If counter overflows 401 * CPT()_VQ()_MISC_INT[DBELL_DOVF] is set. To reset the count back to 402 * zero, write one to clear CPT()_VQ()_MISC_INT_ENA_W1C[DBELL_DOVF], 403 * then write a value of 2^20 minus the read [DBELL_CNT], then write one 404 * to CPT()_VQ()_MISC_INT_W1C[DBELL_DOVF] and 405 * CPT()_VQ()_MISC_INT_ENA_W1S[DBELL_DOVF]. Must be a multiple of 8. 406 * All CPT instructions are 8 words and require a doorbell count of 407 * multiple of 8. 408 */ 409 union cptx_vqx_doorbell { 410 u64 u; 411 struct cptx_vqx_doorbell_s { 412 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 413 u64 reserved_20_63:44; 414 u64 dbell_cnt:20; 415 #else /* Word 0 - Little Endian */ 416 u64 dbell_cnt:20; 417 u64 reserved_20_63:44; 418 #endif /* Word 0 - End */ 419 } s; 420 }; 421 422 /** 423 * Register (NCB) cpt#_vq#_inprog 424 * 425 * CPT Queue In Progress Count Registers 426 * These registers contain the per-queue instruction in flight registers. 427 * cptx_vqx_inprog_s 428 * Word0 429 * reserved_8_63:56 [63:8] Reserved. 430 * inflight:8 [7:0](RO/H) Inflight count. Counts the number of instructions 431 * for the VF for which CPT is fetching, executing or responding to 432 * instructions. However this does not include any interrupts that are 433 * awaiting software handling (CPT()_VQ()_DONE[DONE] != 0x0). 434 * A queue may not be reconfigured until: 435 * 1. CPT()_VQ()_CTL[ENA] is cleared by software. 436 * 2. [INFLIGHT] is polled until equals to zero. 437 */ 438 union cptx_vqx_inprog { 439 u64 u; 440 struct cptx_vqx_inprog_s { 441 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 442 u64 reserved_8_63:56; 443 u64 inflight:8; 444 #else /* Word 0 - Little Endian */ 445 u64 inflight:8; 446 u64 reserved_8_63:56; 447 #endif /* Word 0 - End */ 448 } s; 449 }; 450 451 /** 452 * Register (NCB) cpt#_vq#_misc_int 453 * 454 * CPT Queue Misc Interrupt Register 455 * These registers contain the per-queue miscellaneous interrupts. 456 * cptx_vqx_misc_int_s 457 * Word 0 458 * reserved_5_63:59 [63:5] Reserved. 459 * swerr:1 [4:4](R/W1C/H) Software error from engines. 460 * nwrp:1 [3:3](R/W1C/H) NCB result write response error. 461 * irde:1 [2:2](R/W1C/H) Instruction NCB read response error. 462 * dovf:1 [1:1](R/W1C/H) Doorbell overflow. 463 * mbox:1 [0:0](R/W1C/H) PF to VF mailbox interrupt. Set when 464 * CPT()_VF()_PF_MBOX(0) is written. 465 * 466 */ 467 union cptx_vqx_misc_int { 468 u64 u; 469 struct cptx_vqx_misc_int_s { 470 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 471 u64 reserved_5_63:59; 472 u64 swerr:1; 473 u64 nwrp:1; 474 u64 irde:1; 475 u64 dovf:1; 476 u64 mbox:1; 477 #else /* Word 0 - Little Endian */ 478 u64 mbox:1; 479 u64 dovf:1; 480 u64 irde:1; 481 u64 nwrp:1; 482 u64 swerr:1; 483 u64 reserved_5_63:59; 484 #endif /* Word 0 - End */ 485 } s; 486 }; 487 488 /** 489 * Register (NCB) cpt#_vq#_done_ack 490 * 491 * CPT Queue Done Count Ack Registers 492 * This register is written by software to acknowledge interrupts. 493 * cptx_vqx_done_ack_s 494 * Word0 495 * reserved_20_63:44 [63:20] Reserved. 496 * done_ack:20 [19:0](R/W/H) Number of decrements to CPT()_VQ()_DONE[DONE]. 497 * Reads CPT()_VQ()_DONE[DONE]. Written by software to acknowledge 498 * interrupts. If CPT()_VQ()_DONE[DONE] is still nonzero the interrupt 499 * will be re-sent if the conditions described in CPT()_VQ()_DONE[DONE] 500 * are satisfied. 501 * 502 */ 503 union cptx_vqx_done_ack { 504 u64 u; 505 struct cptx_vqx_done_ack_s { 506 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 507 u64 reserved_20_63:44; 508 u64 done_ack:20; 509 #else /* Word 0 - Little Endian */ 510 u64 done_ack:20; 511 u64 reserved_20_63:44; 512 #endif /* Word 0 - End */ 513 } s; 514 }; 515 516 /** 517 * Register (NCB) cpt#_vq#_done 518 * 519 * CPT Queue Done Count Registers 520 * These registers contain the per-queue instruction done count. 521 * cptx_vqx_done_s 522 * Word0 523 * reserved_20_63:44 [63:20] Reserved. 524 * done:20 [19:0](R/W/H) Done count. When CPT_INST_S[DONEINT] set and that 525 * instruction completes, CPT()_VQ()_DONE[DONE] is incremented when the 526 * instruction finishes. Write to this field are for diagnostic use only; 527 * instead software writes CPT()_VQ()_DONE_ACK with the number of 528 * decrements for this field. 529 * Interrupts are sent as follows: 530 * * When CPT()_VQ()_DONE[DONE] = 0, then no results are pending, the 531 * interrupt coalescing timer is held to zero, and an interrupt is not 532 * sent. 533 * * When CPT()_VQ()_DONE[DONE] != 0, then the interrupt coalescing timer 534 * counts. If the counter is >= CPT()_VQ()_DONE_WAIT[TIME_WAIT]*1024, or 535 * CPT()_VQ()_DONE[DONE] >= CPT()_VQ()_DONE_WAIT[NUM_WAIT], i.e. enough 536 * time has passed or enough results have arrived, then the interrupt is 537 * sent. 538 * * When CPT()_VQ()_DONE_ACK is written (or CPT()_VQ()_DONE is written 539 * but this is not typical), the interrupt coalescing timer restarts. 540 * Note after decrementing this interrupt equation is recomputed, 541 * for example if CPT()_VQ()_DONE[DONE] >= CPT()_VQ()_DONE_WAIT[NUM_WAIT] 542 * and because the timer is zero, the interrupt will be resent immediately. 543 * (This covers the race case between software acknowledging an interrupt 544 * and a result returning.) 545 * * When CPT()_VQ()_DONE_ENA_W1S[DONE] = 0, interrupts are not sent, 546 * but the counting described above still occurs. 547 * Since CPT instructions complete out-of-order, if software is using 548 * completion interrupts the suggested scheme is to request a DONEINT on 549 * each request, and when an interrupt arrives perform a "greedy" scan for 550 * completions; even if a later command is acknowledged first this will 551 * not result in missing a completion. 552 * Software is responsible for making sure [DONE] does not overflow; 553 * for example by insuring there are not more than 2^20-1 instructions in 554 * flight that may request interrupts. 555 * 556 */ 557 union cptx_vqx_done { 558 u64 u; 559 struct cptx_vqx_done_s { 560 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 561 u64 reserved_20_63:44; 562 u64 done:20; 563 #else /* Word 0 - Little Endian */ 564 u64 done:20; 565 u64 reserved_20_63:44; 566 #endif /* Word 0 - End */ 567 } s; 568 }; 569 570 /** 571 * Register (NCB) cpt#_vq#_done_wait 572 * 573 * CPT Queue Done Interrupt Coalescing Wait Registers 574 * Specifies the per queue interrupt coalescing settings. 575 * cptx_vqx_done_wait_s 576 * Word0 577 * reserved_48_63:16 [63:48] Reserved. 578 * time_wait:16; [47:32](R/W) Time hold-off. When CPT()_VQ()_DONE[DONE] = 0 579 * or CPT()_VQ()_DONE_ACK is written a timer is cleared. When the timer 580 * reaches [TIME_WAIT]*1024 then interrupt coalescing ends. 581 * see CPT()_VQ()_DONE[DONE]. If 0x0, time coalescing is disabled. 582 * reserved_20_31:12 [31:20] Reserved. 583 * num_wait:20 [19:0](R/W) Number of messages hold-off. 584 * When CPT()_VQ()_DONE[DONE] >= [NUM_WAIT] then interrupt coalescing ends 585 * see CPT()_VQ()_DONE[DONE]. If 0x0, same behavior as 0x1. 586 * 587 */ 588 union cptx_vqx_done_wait { 589 u64 u; 590 struct cptx_vqx_done_wait_s { 591 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 592 u64 reserved_48_63:16; 593 u64 time_wait:16; 594 u64 reserved_20_31:12; 595 u64 num_wait:20; 596 #else /* Word 0 - Little Endian */ 597 u64 num_wait:20; 598 u64 reserved_20_31:12; 599 u64 time_wait:16; 600 u64 reserved_48_63:16; 601 #endif /* Word 0 - End */ 602 } s; 603 }; 604 605 /** 606 * Register (NCB) cpt#_vq#_done_ena_w1s 607 * 608 * CPT Queue Done Interrupt Enable Set Registers 609 * Write 1 to these registers will enable the DONEINT interrupt for the queue. 610 * cptx_vqx_done_ena_w1s_s 611 * Word0 612 * reserved_1_63:63 [63:1] Reserved. 613 * done:1 [0:0](R/W1S/H) Write 1 will enable DONEINT for this queue. 614 * Write 0 has no effect. Read will return the enable bit. 615 */ 616 union cptx_vqx_done_ena_w1s { 617 u64 u; 618 struct cptx_vqx_done_ena_w1s_s { 619 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 620 u64 reserved_1_63:63; 621 u64 done:1; 622 #else /* Word 0 - Little Endian */ 623 u64 done:1; 624 u64 reserved_1_63:63; 625 #endif /* Word 0 - End */ 626 } s; 627 }; 628 629 /** 630 * Register (NCB) cpt#_vq#_ctl 631 * 632 * CPT VF Queue Control Registers 633 * This register configures queues. This register should be changed (other than 634 * clearing [ENA]) only when quiescent (see CPT()_VQ()_INPROG[INFLIGHT]). 635 * cptx_vqx_ctl_s 636 * Word0 637 * reserved_1_63:63 [63:1] Reserved. 638 * ena:1 [0:0](R/W/H) Enables the logical instruction queue. 639 * See also CPT()_PF_Q()_CTL[CONT_ERR] and CPT()_VQ()_INPROG[INFLIGHT]. 640 * 1 = Queue is enabled. 641 * 0 = Queue is disabled. 642 */ 643 union cptx_vqx_ctl { 644 u64 u; 645 struct cptx_vqx_ctl_s { 646 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ 647 u64 reserved_1_63:63; 648 u64 ena:1; 649 #else /* Word 0 - Little Endian */ 650 u64 ena:1; 651 u64 reserved_1_63:63; 652 #endif /* Word 0 - End */ 653 } s; 654 }; 655 #endif /*__CPT_HW_TYPES_H*/ 656