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_OTP_H
9 #define _HARDWARE_STRUCTS_OTP_H
10 
11 /**
12  * \file rp2350/otp.h
13  */
14 
15 #include "hardware/address_mapped.h"
16 #include "hardware/regs/otp.h"
17 
18 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf#tab-registerlist_otp
19 //
20 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature)
21 // _REG_(x) will link to the corresponding register in hardware/regs/otp.h.
22 //
23 // Bit-field descriptions are of the form:
24 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION
25 
26 typedef struct {
27     // (Description copied from array index 0 register OTP_SW_LOCK0 applies similarly to other array indexes)
28     _REG_(OTP_SW_LOCK0_OFFSET) // OTP_SW_LOCK0
29     // Software lock register for page 0.
30     // 0x0000000c [3:2]   NSEC         (-) Non-secure lock status
31     // 0x00000003 [1:0]   SEC          (-) Secure lock status
32     io_rw_32 sw_lock[64];
33 
34     _REG_(OTP_SBPI_INSTR_OFFSET) // OTP_SBPI_INSTR
35     // Dispatch instructions to the SBPI interface, used for programming the OTP fuses
36     // 0x40000000 [30]    EXEC         (0) Execute instruction
37     // 0x20000000 [29]    IS_WR        (0) Payload type is write
38     // 0x10000000 [28]    HAS_PAYLOAD  (0) Instruction has payload (data to be written or to be read)
39     // 0x0f000000 [27:24] PAYLOAD_SIZE_M1 (0x0) Instruction payload size in bytes minus 1
40     // 0x00ff0000 [23:16] TARGET       (0x00) Instruction target, it can be PMC (0x3a) or DAP (0x02)
41     // 0x0000ff00 [15:8]  CMD          (0x00)
42     // 0x000000ff [7:0]   SHORT_WDATA  (0x00) wdata to be used only when payload_size_m1=0
43     io_rw_32 sbpi_instr;
44 
45     // (Description copied from array index 0 register OTP_SBPI_WDATA_0 applies similarly to other array indexes)
46     _REG_(OTP_SBPI_WDATA_0_OFFSET) // OTP_SBPI_WDATA_0
47     // SBPI write payload bytes 3
48     // 0xffffffff [31:0]  SBPI_WDATA_0 (0x00000000)
49     io_rw_32 sbpi_wdata[4];
50 
51     // (Description copied from array index 0 register OTP_SBPI_RDATA_0 applies similarly to other array indexes)
52     _REG_(OTP_SBPI_RDATA_0_OFFSET) // OTP_SBPI_RDATA_0
53     // Read payload bytes 3
54     // 0xffffffff [31:0]  SBPI_RDATA_0 (0x00000000)
55     io_ro_32 sbpi_rdata[4];
56 
57     _REG_(OTP_SBPI_STATUS_OFFSET) // OTP_SBPI_STATUS
58     // 0x00ff0000 [23:16] MISO         (-) SBPI MISO (master in - slave out): response from SBPI
59     // 0x00001000 [12]    FLAG         (-) SBPI flag
60     // 0x00000100 [8]     INSTR_MISS   (0) Last instruction missed (dropped), as the previous has...
61     // 0x00000010 [4]     INSTR_DONE   (0) Last instruction done
62     // 0x00000001 [0]     RDATA_VLD    (0) Read command has returned data
63     io_rw_32 sbpi_status;
64 
65     _REG_(OTP_USR_OFFSET) // OTP_USR
66     // Controls for APB data read interface (USER interface)
67     // 0x00000010 [4]     PD           (0) Power-down; 1 disables current reference
68     // 0x00000001 [0]     DCTRL        (1) 1 enables USER interface; 0 disables USER interface...
69     io_rw_32 usr;
70 
71     _REG_(OTP_DBG_OFFSET) // OTP_DBG
72     // Debug for OTP power-on state machine
73     // 0x00001000 [12]    CUSTOMER_RMA_FLAG (-) The chip is in RMA mode
74     // 0x000000f0 [7:4]   PSM_STATE    (-) Monitor the PSM FSM's state
75     // 0x00000008 [3]     ROSC_UP      (-) Ring oscillator is up and running
76     // 0x00000004 [2]     ROSC_UP_SEEN (0) Ring oscillator was seen up and running
77     // 0x00000002 [1]     BOOT_DONE    (-) PSM boot done status flag
78     // 0x00000001 [0]     PSM_DONE     (-) PSM done status flag
79     io_rw_32 dbg;
80 
81     uint32_t _pad0;
82 
83     _REG_(OTP_BIST_OFFSET) // OTP_BIST
84     // During BIST, count address locations that have at least one leaky bit
85     // 0x40000000 [30]    CNT_FAIL     (-) Flag if the count of address locations with at least one...
86     // 0x20000000 [29]    CNT_CLR      (0) Clear counter before use
87     // 0x10000000 [28]    CNT_ENA      (0) Enable the counter before the BIST function is initiated
88     // 0x0fff0000 [27:16] CNT_MAX      (0xfff) The cnt_fail flag will be set if the number of leaky...
89     // 0x00001fff [12:0]  CNT          (-) Number of locations that have at least one leaky bit
90     io_rw_32 bist;
91 
92     // (Description copied from array index 0 register OTP_CRT_KEY_W0 applies similarly to other array indexes)
93     _REG_(OTP_CRT_KEY_W0_OFFSET) // OTP_CRT_KEY_W0
94     // Word 0 (bits 31
95     // 0xffffffff [31:0]  CRT_KEY_W0   (0x00000000)
96     io_wo_32 crt_key_w[4];
97 
98     _REG_(OTP_CRITICAL_OFFSET) // OTP_CRITICAL
99     // Quickly check values of critical flags read during boot up
100     // 0x00020000 [17]    RISCV_DISABLE (0)
101     // 0x00010000 [16]    ARM_DISABLE  (0)
102     // 0x00000060 [6:5]   GLITCH_DETECTOR_SENS (0x0)
103     // 0x00000010 [4]     GLITCH_DETECTOR_ENABLE (0)
104     // 0x00000008 [3]     DEFAULT_ARCHSEL (0)
105     // 0x00000004 [2]     DEBUG_DISABLE (0)
106     // 0x00000002 [1]     SECURE_DEBUG_DISABLE (0)
107     // 0x00000001 [0]     SECURE_BOOT_ENABLE (0)
108     io_ro_32 critical;
109 
110     _REG_(OTP_KEY_VALID_OFFSET) // OTP_KEY_VALID
111     // Which keys were valid (enrolled) at boot time
112     // 0x000000ff [7:0]   KEY_VALID    (0x00)
113     io_ro_32 key_valid;
114 
115     _REG_(OTP_DEBUGEN_OFFSET) // OTP_DEBUGEN
116     // Enable a debug feature that has been disabled. Debug features are disabled if one of the relevant critical boot flags is set in OTP (DEBUG_DISABLE or SECURE_DEBUG_DISABLE), OR if a debug key is marked valid in OTP, and the matching key value has not been supplied over SWD.
117     // 0x00000100 [8]     MISC         (0) Enable other debug components
118     // 0x00000008 [3]     PROC1_SECURE (0) Permit core 1's Mem-AP to generate Secure accesses,...
119     // 0x00000004 [2]     PROC1        (0) Enable core 1's Mem-AP if it is currently disabled
120     // 0x00000002 [1]     PROC0_SECURE (0) Permit core 0's Mem-AP to generate Secure accesses,...
121     // 0x00000001 [0]     PROC0        (0) Enable core 0's Mem-AP if it is currently disabled
122     io_rw_32 debugen;
123 
124     _REG_(OTP_DEBUGEN_LOCK_OFFSET) // OTP_DEBUGEN_LOCK
125     // Write 1s to lock corresponding bits in DEBUGEN
126     // 0x00000100 [8]     MISC         (0) Write 1 to lock the MISC bit of DEBUGEN
127     // 0x00000008 [3]     PROC1_SECURE (0) Write 1 to lock the PROC1_SECURE bit of DEBUGEN
128     // 0x00000004 [2]     PROC1        (0) Write 1 to lock the PROC1 bit of DEBUGEN
129     // 0x00000002 [1]     PROC0_SECURE (0) Write 1 to lock the PROC0_SECURE bit of DEBUGEN
130     // 0x00000001 [0]     PROC0        (0) Write 1 to lock the PROC0 bit of DEBUGEN
131     io_rw_32 debugen_lock;
132 
133     _REG_(OTP_ARCHSEL_OFFSET) // OTP_ARCHSEL
134     // Architecture select (Arm/RISC-V), applied on next processor reset. The default and allowable values of this register are constrained by the critical boot flags.
135     // 0x00000002 [1]     CORE1        (0) Select architecture for core 1
136     // 0x00000001 [0]     CORE0        (0) Select architecture for core 0
137     io_rw_32 archsel;
138 
139     _REG_(OTP_ARCHSEL_STATUS_OFFSET) // OTP_ARCHSEL_STATUS
140     // Get the current architecture select state of each core
141     // 0x00000002 [1]     CORE1        (0) Current architecture for core 0
142     // 0x00000001 [0]     CORE0        (0) Current architecture for core 0
143     io_ro_32 archsel_status;
144 
145     _REG_(OTP_BOOTDIS_OFFSET) // OTP_BOOTDIS
146     // Tell the bootrom to ignore scratch register boot vectors (both power manager and watchdog) on the next power up.
147     // 0x00000002 [1]     NEXT         (0) This flag always ORs writes into its current contents
148     // 0x00000001 [0]     NOW          (0) When the core is powered down, the current value of...
149     io_rw_32 bootdis;
150 
151     _REG_(OTP_INTR_OFFSET) // OTP_INTR
152     // Raw Interrupts
153     // 0x00000010 [4]     APB_RD_NSEC_FAIL (0)
154     // 0x00000008 [3]     APB_RD_SEC_FAIL (0)
155     // 0x00000004 [2]     APB_DCTRL_FAIL (0)
156     // 0x00000002 [1]     SBPI_WR_FAIL (0)
157     // 0x00000001 [0]     SBPI_FLAG_N  (0)
158     io_rw_32 intr;
159 
160     _REG_(OTP_INTE_OFFSET) // OTP_INTE
161     // Interrupt Enable
162     // 0x00000010 [4]     APB_RD_NSEC_FAIL (0)
163     // 0x00000008 [3]     APB_RD_SEC_FAIL (0)
164     // 0x00000004 [2]     APB_DCTRL_FAIL (0)
165     // 0x00000002 [1]     SBPI_WR_FAIL (0)
166     // 0x00000001 [0]     SBPI_FLAG_N  (0)
167     io_rw_32 inte;
168 
169     _REG_(OTP_INTF_OFFSET) // OTP_INTF
170     // Interrupt Force
171     // 0x00000010 [4]     APB_RD_NSEC_FAIL (0)
172     // 0x00000008 [3]     APB_RD_SEC_FAIL (0)
173     // 0x00000004 [2]     APB_DCTRL_FAIL (0)
174     // 0x00000002 [1]     SBPI_WR_FAIL (0)
175     // 0x00000001 [0]     SBPI_FLAG_N  (0)
176     io_rw_32 intf;
177 
178     _REG_(OTP_INTS_OFFSET) // OTP_INTS
179     // Interrupt status after masking & forcing
180     // 0x00000010 [4]     APB_RD_NSEC_FAIL (0)
181     // 0x00000008 [3]     APB_RD_SEC_FAIL (0)
182     // 0x00000004 [2]     APB_DCTRL_FAIL (0)
183     // 0x00000002 [1]     SBPI_WR_FAIL (0)
184     // 0x00000001 [0]     SBPI_FLAG_N  (0)
185     io_ro_32 ints;
186 } otp_hw_t;
187 
188 #define otp_hw ((otp_hw_t *)OTP_BASE)
189 static_assert(sizeof (otp_hw_t) == 0x0174, "");
190 
191 #endif // _HARDWARE_STRUCTS_OTP_H
192 
193