1 // THIS HEADER FILE IS AUTOMATICALLY GENERATED -- DO NOT EDIT 2 3 /** 4 * Copyright (c) 2024 Raspberry Pi Ltd. 5 * 6 * SPDX-License-Identifier: BSD-3-Clause 7 */ 8 #ifndef _HARDWARE_STRUCTS_DMA_H 9 #define _HARDWARE_STRUCTS_DMA_H 10 11 /** 12 * \file rp2350/dma.h 13 */ 14 15 #include "hardware/address_mapped.h" 16 #include "hardware/regs/dma.h" 17 #include "hardware/structs/dma_debug.h" 18 19 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf#tab-registerlist_dma 20 // 21 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature) 22 // _REG_(x) will link to the corresponding register in hardware/regs/dma.h. 23 // 24 // Bit-field descriptions are of the form: 25 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION 26 27 typedef struct { 28 _REG_(DMA_CH0_READ_ADDR_OFFSET) // DMA_CH0_READ_ADDR 29 // DMA Channel 0 Read Address pointer 30 // 0xffffffff [31:0] CH0_READ_ADDR (0x00000000) This register updates automatically each time a read completes 31 io_rw_32 read_addr; 32 33 _REG_(DMA_CH0_WRITE_ADDR_OFFSET) // DMA_CH0_WRITE_ADDR 34 // DMA Channel 0 Write Address pointer 35 // 0xffffffff [31:0] CH0_WRITE_ADDR (0x00000000) This register updates automatically each time a write completes 36 io_rw_32 write_addr; 37 38 _REG_(DMA_CH0_TRANS_COUNT_OFFSET) // DMA_CH0_TRANS_COUNT 39 // DMA Channel 0 Transfer Count 40 // 0xf0000000 [31:28] MODE (0x0) When MODE is 0x0, the transfer count decrements with... 41 // 0x0fffffff [27:0] COUNT (0x0000000) 28-bit transfer count (256 million transfers maximum) 42 io_rw_32 transfer_count; 43 44 _REG_(DMA_CH0_CTRL_TRIG_OFFSET) // DMA_CH0_CTRL_TRIG 45 // DMA Channel 0 Control and Status 46 // 0x80000000 [31] AHB_ERROR (0) Logical OR of the READ_ERROR and WRITE_ERROR flags 47 // 0x40000000 [30] READ_ERROR (0) If 1, the channel received a read bus error 48 // 0x20000000 [29] WRITE_ERROR (0) If 1, the channel received a write bus error 49 // 0x04000000 [26] BUSY (0) This flag goes high when the channel starts a new... 50 // 0x02000000 [25] SNIFF_EN (0) If 1, this channel's data transfers are visible to the... 51 // 0x01000000 [24] BSWAP (0) Apply byte-swap transformation to DMA data 52 // 0x00800000 [23] IRQ_QUIET (0) In QUIET mode, the channel does not generate IRQs at the... 53 // 0x007e0000 [22:17] TREQ_SEL (0x00) Select a Transfer Request signal 54 // 0x0001e000 [16:13] CHAIN_TO (0x0) When this channel completes, it will trigger the channel... 55 // 0x00001000 [12] RING_SEL (0) Select whether RING_SIZE applies to read or write addresses 56 // 0x00000f00 [11:8] RING_SIZE (0x0) Size of address wrap region 57 // 0x00000080 [7] INCR_WRITE_REV (0) If 1, and INCR_WRITE is 1, the write address is... 58 // 0x00000040 [6] INCR_WRITE (0) If 1, the write address increments with each transfer 59 // 0x00000020 [5] INCR_READ_REV (0) If 1, and INCR_READ is 1, the read address is... 60 // 0x00000010 [4] INCR_READ (0) If 1, the read address increments with each transfer 61 // 0x0000000c [3:2] DATA_SIZE (0x0) Set the size of each bus transfer (byte/halfword/word) 62 // 0x00000002 [1] HIGH_PRIORITY (0) HIGH_PRIORITY gives a channel preferential treatment in... 63 // 0x00000001 [0] EN (0) DMA Channel Enable 64 io_rw_32 ctrl_trig; 65 66 _REG_(DMA_CH0_AL1_CTRL_OFFSET) // DMA_CH0_AL1_CTRL 67 // Alias for channel 0 CTRL register 68 // 0xffffffff [31:0] CH0_AL1_CTRL (-) 69 io_rw_32 al1_ctrl; 70 71 _REG_(DMA_CH0_AL1_READ_ADDR_OFFSET) // DMA_CH0_AL1_READ_ADDR 72 // Alias for channel 0 READ_ADDR register 73 // 0xffffffff [31:0] CH0_AL1_READ_ADDR (-) 74 io_rw_32 al1_read_addr; 75 76 _REG_(DMA_CH0_AL1_WRITE_ADDR_OFFSET) // DMA_CH0_AL1_WRITE_ADDR 77 // Alias for channel 0 WRITE_ADDR register 78 // 0xffffffff [31:0] CH0_AL1_WRITE_ADDR (-) 79 io_rw_32 al1_write_addr; 80 81 _REG_(DMA_CH0_AL1_TRANS_COUNT_TRIG_OFFSET) // DMA_CH0_AL1_TRANS_COUNT_TRIG 82 // Alias for channel 0 TRANS_COUNT register + 83 // 0xffffffff [31:0] CH0_AL1_TRANS_COUNT_TRIG (-) 84 io_rw_32 al1_transfer_count_trig; 85 86 _REG_(DMA_CH0_AL2_CTRL_OFFSET) // DMA_CH0_AL2_CTRL 87 // Alias for channel 0 CTRL register 88 // 0xffffffff [31:0] CH0_AL2_CTRL (-) 89 io_rw_32 al2_ctrl; 90 91 _REG_(DMA_CH0_AL2_TRANS_COUNT_OFFSET) // DMA_CH0_AL2_TRANS_COUNT 92 // Alias for channel 0 TRANS_COUNT register 93 // 0xffffffff [31:0] CH0_AL2_TRANS_COUNT (-) 94 io_rw_32 al2_transfer_count; 95 96 _REG_(DMA_CH0_AL2_READ_ADDR_OFFSET) // DMA_CH0_AL2_READ_ADDR 97 // Alias for channel 0 READ_ADDR register 98 // 0xffffffff [31:0] CH0_AL2_READ_ADDR (-) 99 io_rw_32 al2_read_addr; 100 101 _REG_(DMA_CH0_AL2_WRITE_ADDR_TRIG_OFFSET) // DMA_CH0_AL2_WRITE_ADDR_TRIG 102 // Alias for channel 0 WRITE_ADDR register + 103 // 0xffffffff [31:0] CH0_AL2_WRITE_ADDR_TRIG (-) 104 io_rw_32 al2_write_addr_trig; 105 106 _REG_(DMA_CH0_AL3_CTRL_OFFSET) // DMA_CH0_AL3_CTRL 107 // Alias for channel 0 CTRL register 108 // 0xffffffff [31:0] CH0_AL3_CTRL (-) 109 io_rw_32 al3_ctrl; 110 111 _REG_(DMA_CH0_AL3_WRITE_ADDR_OFFSET) // DMA_CH0_AL3_WRITE_ADDR 112 // Alias for channel 0 WRITE_ADDR register 113 // 0xffffffff [31:0] CH0_AL3_WRITE_ADDR (-) 114 io_rw_32 al3_write_addr; 115 116 _REG_(DMA_CH0_AL3_TRANS_COUNT_OFFSET) // DMA_CH0_AL3_TRANS_COUNT 117 // Alias for channel 0 TRANS_COUNT register 118 // 0xffffffff [31:0] CH0_AL3_TRANS_COUNT (-) 119 io_rw_32 al3_transfer_count; 120 121 _REG_(DMA_CH0_AL3_READ_ADDR_TRIG_OFFSET) // DMA_CH0_AL3_READ_ADDR_TRIG 122 // Alias for channel 0 READ_ADDR register + 123 // 0xffffffff [31:0] CH0_AL3_READ_ADDR_TRIG (-) 124 io_rw_32 al3_read_addr_trig; 125 } dma_channel_hw_t; 126 127 typedef struct { 128 _REG_(DMA_MPU_BAR0_OFFSET) // DMA_MPU_BAR0 129 // Base address register for MPU region 0 130 // 0xffffffe0 [31:5] ADDR (0x0000000) This MPU region matches addresses where addr[31:5] (the... 131 io_rw_32 bar; 132 133 _REG_(DMA_MPU_LAR0_OFFSET) // DMA_MPU_LAR0 134 // Limit address register for MPU region 0 135 // 0xffffffe0 [31:5] ADDR (0x0000000) Limit address bits 31:5 136 // 0x00000004 [2] S (0) Determines the Secure/Non-secure (=1/0) status of... 137 // 0x00000002 [1] P (0) Determines the Privileged/Unprivileged (=1/0) status of... 138 // 0x00000001 [0] EN (0) Region enable 139 io_rw_32 lar; 140 } dma_mpu_region_hw_t; 141 142 typedef struct { 143 _REG_(DMA_INTR_OFFSET) // DMA_INTR 144 // Interrupt Status (raw) 145 // 0x0000ffff [15:0] INTR (0x0000) Raw interrupt status for DMA Channels 0 146 io_rw_32 intr; 147 148 _REG_(DMA_INTE0_OFFSET) // DMA_INTE0 149 // Interrupt Enables for IRQ 0 150 // 0x0000ffff [15:0] INTE0 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 0 151 io_rw_32 inte; 152 153 _REG_(DMA_INTF0_OFFSET) // DMA_INTF0 154 // Force Interrupts 155 // 0x0000ffff [15:0] INTF0 (0x0000) Write 1s to force the corresponding bits in INTS0 156 io_rw_32 intf; 157 158 _REG_(DMA_INTS0_OFFSET) // DMA_INTS0 159 // Interrupt Status for IRQ 0 160 // 0x0000ffff [15:0] INTS0 (0x0000) Indicates active channel interrupt requests which are... 161 io_rw_32 ints; 162 } dma_irq_ctrl_hw_t; 163 164 typedef struct { 165 dma_channel_hw_t ch[16]; 166 167 union { 168 struct { 169 _REG_(DMA_INTR_OFFSET) // DMA_INTR 170 // Interrupt Status (raw) 171 // 0x0000ffff [15:0] INTR (0x0000) Raw interrupt status for DMA Channels 0 172 io_rw_32 intr; 173 174 _REG_(DMA_INTE0_OFFSET) // DMA_INTE0 175 // Interrupt Enables for IRQ 0 176 // 0x0000ffff [15:0] INTE0 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 0 177 io_rw_32 inte0; 178 179 _REG_(DMA_INTF0_OFFSET) // DMA_INTF0 180 // Force Interrupts 181 // 0x0000ffff [15:0] INTF0 (0x0000) Write 1s to force the corresponding bits in INTE0 182 io_rw_32 intf0; 183 184 _REG_(DMA_INTS0_OFFSET) // DMA_INTS0 185 // Interrupt Status for IRQ 0 186 // 0x0000ffff [15:0] INTS0 (0x0000) Indicates active channel interrupt requests which are... 187 io_rw_32 ints0; 188 189 uint32_t __pad0; 190 191 _REG_(DMA_INTE1_OFFSET) // DMA_INTE1 192 // Interrupt Enables for IRQ 1 193 // 0x0000ffff [15:0] INTE1 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 1 194 io_rw_32 inte1; 195 196 _REG_(DMA_INTF1_OFFSET) // DMA_INTF1 197 // Force Interrupts for IRQ 1 198 // 0x0000ffff [15:0] INTF1 (0x0000) Write 1s to force the corresponding bits in INTF1 199 io_rw_32 intf1; 200 201 _REG_(DMA_INTS1_OFFSET) // DMA_INTS1 202 // Interrupt Status (masked) for IRQ 1 203 // 0x0000ffff [15:0] INTS1 (0x0000) Indicates active channel interrupt requests which are... 204 io_rw_32 ints1; 205 206 uint32_t __pad1; 207 208 _REG_(DMA_INTE2_OFFSET) // DMA_INTE2 209 // Interrupt Enables for IRQ 2 210 // 0x0000ffff [15:0] INTE2 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 2 211 io_rw_32 inte2; 212 213 _REG_(DMA_INTF2_OFFSET) // DMA_INTF2 214 // Force Interrupts for IRQ 2 215 // 0x0000ffff [15:0] INTF2 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 2 216 io_rw_32 intf2; 217 218 _REG_(DMA_INTS2_OFFSET) // DMA_INTS2 219 // Interrupt Status (masked) for IRQ 2 220 // 0x0000ffff [15:0] INTS2 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 2 221 io_rw_32 ints2; 222 223 uint32_t __pad2; 224 225 _REG_(DMA_INTE3_OFFSET) // DMA_INTE3 226 // Interrupt Enables for IRQ 3 227 // 0x0000ffff [15:0] INTE3 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 3 228 io_rw_32 inte3; 229 230 _REG_(DMA_INTF3_OFFSET) // DMA_INTF3 231 // Force Interrupts for IRQ 3 232 // 0x0000ffff [15:0] INTF3 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 3 233 io_rw_32 intf3; 234 235 _REG_(DMA_INTS3_OFFSET) // DMA_INTS3 236 // Interrupt Status (masked) for IRQ 3 237 // 0x0000ffff [15:0] INTS3 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 3 238 io_rw_32 ints3; 239 }; 240 dma_irq_ctrl_hw_t irq_ctrl[4]; 241 }; 242 243 // (Description copied from array index 0 register DMA_TIMER0 applies similarly to other array indexes) 244 _REG_(DMA_TIMER0_OFFSET) // DMA_TIMER0 245 // Pacing timer (generate periodic TREQs) 246 // 0xffff0000 [31:16] X (0x0000) Pacing Timer Dividend 247 // 0x0000ffff [15:0] Y (0x0000) Pacing Timer Divisor 248 io_rw_32 timer[4]; 249 250 _REG_(DMA_MULTI_CHAN_TRIGGER_OFFSET) // DMA_MULTI_CHAN_TRIGGER 251 // Trigger one or more channels simultaneously 252 // 0x0000ffff [15:0] MULTI_CHAN_TRIGGER (0x0000) Each bit in this register corresponds to a DMA channel 253 io_wo_32 multi_channel_trigger; 254 255 _REG_(DMA_SNIFF_CTRL_OFFSET) // DMA_SNIFF_CTRL 256 // Sniffer Control 257 // 0x00000800 [11] OUT_INV (0) If set, the result appears inverted (bitwise complement)... 258 // 0x00000400 [10] OUT_REV (0) If set, the result appears bit-reversed when read 259 // 0x00000200 [9] BSWAP (0) Locally perform a byte reverse on the sniffed data,... 260 // 0x000001e0 [8:5] CALC (0x0) 261 // 0x0000001e [4:1] DMACH (0x0) DMA channel for Sniffer to observe 262 // 0x00000001 [0] EN (0) Enable sniffer 263 io_rw_32 sniff_ctrl; 264 265 _REG_(DMA_SNIFF_DATA_OFFSET) // DMA_SNIFF_DATA 266 // Data accumulator for sniff hardware 267 // 0xffffffff [31:0] SNIFF_DATA (0x00000000) Write an initial seed value here before starting a DMA... 268 io_rw_32 sniff_data; 269 270 uint32_t _pad0; 271 272 _REG_(DMA_FIFO_LEVELS_OFFSET) // DMA_FIFO_LEVELS 273 // Debug RAF, WAF, TDF levels 274 // 0x00ff0000 [23:16] RAF_LVL (0x00) Current Read-Address-FIFO fill level 275 // 0x0000ff00 [15:8] WAF_LVL (0x00) Current Write-Address-FIFO fill level 276 // 0x000000ff [7:0] TDF_LVL (0x00) Current Transfer-Data-FIFO fill level 277 io_ro_32 fifo_levels; 278 279 _REG_(DMA_CHAN_ABORT_OFFSET) // DMA_CHAN_ABORT 280 // Abort an in-progress transfer sequence on one or more channels 281 // 0x0000ffff [15:0] CHAN_ABORT (0x0000) Each bit corresponds to a channel 282 io_wo_32 abort; 283 284 _REG_(DMA_N_CHANNELS_OFFSET) // DMA_N_CHANNELS 285 // The number of channels this DMA instance is equipped with 286 // 0x0000001f [4:0] N_CHANNELS (-) 287 io_ro_32 n_channels; 288 289 uint32_t _pad1[5]; 290 291 // (Description copied from array index 0 register DMA_SECCFG_CH0 applies similarly to other array indexes) 292 _REG_(DMA_SECCFG_CH0_OFFSET) // DMA_SECCFG_CH0 293 // Security level configuration for channel 0. 294 // 0x00000004 [2] LOCK (0) LOCK is 0 at reset, and is set to 1 automatically upon a... 295 // 0x00000002 [1] S (1) Secure channel 296 // 0x00000001 [0] P (1) Privileged channel 297 io_rw_32 seccfg_ch[16]; 298 299 // (Description copied from array index 0 register DMA_SECCFG_IRQ0 applies similarly to other array indexes) 300 _REG_(DMA_SECCFG_IRQ0_OFFSET) // DMA_SECCFG_IRQ0 301 // Security configuration for IRQ 0 302 // 0x00000002 [1] S (1) Secure IRQ 303 // 0x00000001 [0] P (1) Privileged IRQ 304 io_rw_32 seccfg_irq[4]; 305 306 _REG_(DMA_SECCFG_MISC_OFFSET) // DMA_SECCFG_MISC 307 // Miscellaneous security configuration 308 // 0x00000200 [9] TIMER3_S (1) If 1, the TIMER3 register is only accessible from a... 309 // 0x00000100 [8] TIMER3_P (1) If 1, the TIMER3 register is only accessible from a... 310 // 0x00000080 [7] TIMER2_S (1) If 1, the TIMER2 register is only accessible from a... 311 // 0x00000040 [6] TIMER2_P (1) If 1, the TIMER2 register is only accessible from a... 312 // 0x00000020 [5] TIMER1_S (1) If 1, the TIMER1 register is only accessible from a... 313 // 0x00000010 [4] TIMER1_P (1) If 1, the TIMER1 register is only accessible from a... 314 // 0x00000008 [3] TIMER0_S (1) If 1, the TIMER0 register is only accessible from a... 315 // 0x00000004 [2] TIMER0_P (1) If 1, the TIMER0 register is only accessible from a... 316 // 0x00000002 [1] SNIFF_S (1) If 1, the sniffer can see data transfers from Secure... 317 // 0x00000001 [0] SNIFF_P (1) If 1, the sniffer can see data transfers from Privileged... 318 io_rw_32 seccfg_misc; 319 320 uint32_t _pad2[11]; 321 322 _REG_(DMA_MPU_CTRL_OFFSET) // DMA_MPU_CTRL 323 // Control register for DMA MPU 324 // 0x00000008 [3] NS_HIDE_ADDR (0) By default, when a region's S bit is clear,... 325 // 0x00000004 [2] S (0) Determine whether an address not covered by an active... 326 // 0x00000002 [1] P (0) Determine whether an address not covered by an active... 327 io_rw_32 mpu_ctrl; 328 329 dma_mpu_region_hw_t mpu_region[8]; 330 } dma_hw_t; 331 332 #define dma_hw ((dma_hw_t *)DMA_BASE) 333 static_assert(sizeof (dma_hw_t) == 0x0544, ""); 334 335 #endif // _HARDWARE_STRUCTS_DMA_H 336 337