Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/bdk/soc/t210.h
3694 views
1
/*
2
* Copyright (c) 2018 naehrwert
3
* Copyright (c) 2018-2023 CTCaer
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms and conditions of the GNU General Public License,
7
* version 2, as published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
*/
17
18
#ifndef _T210_H_
19
#define _T210_H_
20
21
#include <utils/types.h>
22
23
#define IROM_BASE 0x100000
24
#define IRAM_BASE 0x40000000
25
#define HOST1X_BASE 0x50000000
26
#define BPMP_CACHE_BASE 0x50040000
27
#define MSELECT_BASE 0x50060000
28
#define DPAUX1_BASE 0x54040000
29
#define TSEC2_BASE 0x54100000
30
#define DISPLAY_A_BASE 0x54200000
31
#define DISPLAY_B_BASE 0x54240000
32
#define DSI_BASE 0x54300000
33
#define VIC_BASE 0x54340000
34
#define NVJPG_BASE 0x54380000
35
#define NVDEC_BASE 0x54480000
36
#define NVENC_BASE 0x544C0000
37
#define TSEC_BASE 0x54500000
38
#define SOR1_BASE 0x54580000
39
#define GPU_BASE 0x57000000
40
#define GPU_USER_BASE 0x58000000
41
#define PG_BASE 0x60000000
42
#define RES_SEMAPH_BASE 0x60001000
43
#define ARB_SEMAPH_BASE 0x60002000
44
#define ARB_PRI_BASE 0x60003000
45
#define ICTLR_BASE 0x60004000
46
#define TMR_BASE 0x60005000
47
#define CLOCK_BASE 0x60006000
48
#define FLOW_CTLR_BASE 0x60007000
49
#define AHBDMA_BASE 0x60008000
50
#define SYSREG_BASE 0x6000C000
51
#define SB_BASE (SYSREG_BASE + 0x200)
52
#define ACTMON_BASE 0x6000C800
53
#define GPIO_BASE 0x6000D000
54
#define EXCP_VEC_BASE 0x6000F000
55
#define IPATCH_BASE 0x6001DC00
56
#define APBDMA_BASE 0x60020000
57
#define VGPIO_BASE 0x60024000
58
#define APB_MISC_BASE 0x70000000
59
#define PINMUX_AUX_BASE 0x70003000
60
#define UART_BASE 0x70006000
61
#define PWM_BASE 0x7000A000
62
#define I2C_BASE 0x7000C000
63
#define RTC_BASE 0x7000E000
64
#define PMC_BASE 0x7000E400
65
#define FUSE_BASE 0x7000F800
66
#define KFUSE_BASE 0x7000FC00
67
#define SE_BASE 0x70012000
68
#define TSENSOR_BASE 0x70014000
69
#define ATOMICS_BASE 0x70016000
70
#define MC_BASE 0x70019000
71
#define EMC_BASE 0x7001B000
72
#define MC0_BASE 0x7001C000
73
#define MC1_BASE 0x7001D000
74
#define EMC0_BASE 0x7001E000
75
#define EMC1_BASE 0x7001F000
76
#define XUSB_HOST_BASE 0x70090000
77
#define XUSB_PADCTL_BASE 0x7009F000
78
#define XUSB_DEV_BASE 0x700D0000
79
#define SDMMC_BASE 0x700B0000
80
#define SOC_THERM_BASE 0x700E2000
81
#define MIPI_CAL_BASE 0x700E3000
82
#define SYSCTR0_BASE 0x700F0000
83
#define SYSCTR1_BASE 0x70100000
84
#define CL_DVFS_BASE 0x70110000
85
#define APE_BASE 0x702C0000
86
#define AHUB_BASE 0x702D0000
87
#define ADMAIF_BASE 0x702D0000
88
#define AXBAR_BASE 0x702D0800
89
#define I2S_BASE 0x702D1000
90
#define ADMA_BASE 0x702E2000
91
#define AMC_BASE 0x702EF000
92
#define SE2_BASE 0x70412000
93
#define SE_PKA1_BASE 0x70420000
94
#define TZRAM_BASE 0x7C010000
95
#define TZRAM_SIZE 0x10000
96
#define TZRAM_T210B01_SIZE 0x3C000
97
#define USB_BASE 0x7D000000
98
#define USB_OTG_BASE USB_BASE
99
#define USB1_BASE 0x7D004000
100
#define EMEM_BASE 0x80000000
101
102
#define MMIO_REG32(base, off) *(vu32 *)((base) + (off))
103
104
#define HOST1X(off) MMIO_REG32(HOST1X_BASE, off)
105
#define BPMP_CACHE_CTRL(off) MMIO_REG32(BPMP_CACHE_BASE, off)
106
#define MSELECT(off) MMIO_REG32(MSELECT_BASE, off)
107
#define DPAUX1(off) MMIO_REG32(DPAUX1_BASE, off)
108
#define TSEC2(off) MMIO_REG32(TSEC2_BASE, off)
109
#define DISPLAY_A(off) MMIO_REG32(DISPLAY_A_BASE, (off) << 2u)
110
#define DISPLAY_B(off) MMIO_REG32(DISPLAY_B_BASE, (off) << 2u)
111
#define DSI(off) MMIO_REG32(DSI_BASE, (off) << 2u)
112
#define VIC(off) MMIO_REG32(VIC_BASE, off)
113
#define NVJPG(off) MMIO_REG32(NVJPG_BASE, off)
114
#define NVDEC(off) MMIO_REG32(NVDEC_BASE, off)
115
#define NVENC(off) MMIO_REG32(NVENC_BASE, off)
116
#define TSEC(off) MMIO_REG32(TSEC_BASE, off)
117
#define SOR1(off) MMIO_REG32(SOR1_BASE, off)
118
#define GPU(off) MMIO_REG32(GPU_BASE, off)
119
#define GPU_USER(off) MMIO_REG32(GPU_USER_BASE, off)
120
#define PG(off) MMIO_REG32(PG_BASE, off)
121
#define ARB_PRI(off) MMIO_REG32(ARB_PRI_BASE, off)
122
#define ICTLR(cidx, off) MMIO_REG32(ICTLR_BASE + (0x100 * (cidx)), off)
123
#define TMR(off) MMIO_REG32(TMR_BASE, off)
124
#define CLOCK(off) MMIO_REG32(CLOCK_BASE, off)
125
#define FLOW_CTLR(off) MMIO_REG32(FLOW_CTLR_BASE, off)
126
#define AHBDMA(off) MMIO_REG32(AHBDMA_BASE, off)
127
#define SYSREG(off) MMIO_REG32(SYSREG_BASE, off)
128
#define AHB_GIZMO(off) MMIO_REG32(SYSREG_BASE, off)
129
#define SB(off) MMIO_REG32(SB_BASE, off)
130
#define ACTMON(off) MMIO_REG32(ACTMON_BASE, off)
131
#define GPIO(off) MMIO_REG32(GPIO_BASE, off)
132
#define EXCP_VEC(off) MMIO_REG32(EXCP_VEC_BASE, off)
133
#define APBDMA(off) MMIO_REG32(APBDMA_BASE, off)
134
#define VGPIO(off) MMIO_REG32(VGPIO_BASE, off)
135
#define APB_MISC(off) MMIO_REG32(APB_MISC_BASE, off)
136
#define PINMUX_AUX(off) MMIO_REG32(PINMUX_AUX_BASE, off)
137
#define PWM(off) MMIO_REG32(PWM_BASE, off)
138
#define RTC(off) MMIO_REG32(RTC_BASE, off)
139
#define PMC(off) MMIO_REG32(PMC_BASE, off)
140
#define SYSCTR0(off) MMIO_REG32(SYSCTR0_BASE, off)
141
#define SYSCTR1(off) MMIO_REG32(SYSCTR1_BASE, off)
142
#define FUSE(off) MMIO_REG32(FUSE_BASE, off)
143
#define KFUSE(off) MMIO_REG32(KFUSE_BASE, off)
144
#define SE(off) MMIO_REG32(SE_BASE, off)
145
#define MC(off) MMIO_REG32(MC_BASE, off)
146
#define EMC(off) MMIO_REG32(EMC_BASE, off)
147
#define MC_CH0(off) MMIO_REG32(MC0_BASE, off)
148
#define MC_CH1(off) MMIO_REG32(MC1_BASE, off)
149
#define EMC_CH0(off) MMIO_REG32(EMC0_BASE, off)
150
#define EMC_CH1(off) MMIO_REG32(EMC1_BASE, off)
151
#define XUSB_HOST(off) MMIO_REG32(XUSB_HOST_BASE, off)
152
#define XUSB_PADCTL(off) MMIO_REG32(XUSB_PADCTL_BASE, off)
153
#define XUSB_DEV(off) MMIO_REG32(XUSB_DEV_BASE, off)
154
#define XUSB_DEV_XHCI(off) MMIO_REG32(XUSB_DEV_BASE, off)
155
#define XUSB_DEV_PCI(off) MMIO_REG32(XUSB_DEV_BASE + 0x8000, off)
156
#define XUSB_DEV_DEV(off) MMIO_REG32(XUSB_DEV_BASE + 0x9000, off)
157
#define MIPI_CAL(off) MMIO_REG32(MIPI_CAL_BASE, (off) << 2u)
158
#define CL_DVFS(off) MMIO_REG32(CL_DVFS_BASE, off)
159
#define I2S(off) MMIO_REG32(I2S_BASE, off)
160
#define ADMA(off) MMIO_REG32(ADMA_BASE, off)
161
#define AMC(off) MMIO_REG32(AMC_BASE, off)
162
#define SE2(off) MMIO_REG32(SE2_BASE, off)
163
#define SE_PKA1(off) MMIO_REG32(SE_PKA1_BASE, off)
164
#define USB(off) MMIO_REG32(USB_BASE, off)
165
#define USB1(off) MMIO_REG32(USB1_BASE, off)
166
#define TEST_REG(off) MMIO_REG32(0x0, off)
167
168
/* HOST1X v3 registers. */
169
#define HOST1X_CH0_SYNC_BASE 0x2100
170
#define HOST1X_CH0_SYNC_SYNCPT_BASE (HOST1X_CH0_SYNC_BASE + 0xF80)
171
#define HOST1X_CH0_SYNC_SYNCPT_9 (HOST1X_CH0_SYNC_SYNCPT_BASE + 0x24)
172
#define HOST1X_CH0_SYNC_SYNCPT_160 (HOST1X_CH0_SYNC_SYNCPT_BASE + 0x280)
173
174
/*! EVP registers. */
175
#define EVP_CPU_RESET_VECTOR 0x100
176
#define EVP_COP_RESET_VECTOR 0x200
177
#define EVP_COP_UNDEF_VECTOR 0x204
178
#define EVP_COP_SWI_VECTOR 0x208
179
#define EVP_COP_PREFETCH_ABORT_VECTOR 0x20C
180
#define EVP_COP_DATA_ABORT_VECTOR 0x210
181
#define EVP_COP_RSVD_VECTOR 0x214
182
#define EVP_COP_IRQ_VECTOR 0x218
183
#define EVP_COP_FIQ_VECTOR 0x21C
184
#define EVP_COP_IRQ_STS 0x220
185
186
/*! Primary Interrupt Controller registers. */
187
#define PRI_ICTLR_ISR 0x10
188
#define PRI_ICTLR_FIR 0x14
189
#define PRI_ICTLR_FIR_SET 0x18
190
#define PRI_ICTLR_FIR_CLR 0x1C
191
#define PRI_ICTLR_CPU_IER 0x20
192
#define PRI_ICTLR_CPU_IER_SET 0x24
193
#define PRI_ICTLR_CPU_IER_CLR 0x28
194
#define PRI_ICTLR_CPU_IEP_CLASS 0x2C
195
#define PRI_ICTLR_COP_IER 0x30
196
#define PRI_ICTLR_COP_IER_SET 0x34
197
#define PRI_ICTLR_COP_IER_CLR 0x38
198
#define PRI_ICTLR_COP_IEP_CLASS 0x3C
199
200
/* Arbiter registers */
201
#define ARB_PRIO_CPU_PRIORITY 0x0
202
#define ARB_PRIO_COP_PRIORITY 0x4
203
#define ARB_PRIO_VCP_PRIORITY 0x8
204
#define ARB_PRIO_DMA_PRIORITY 0xC
205
#define ARB_PRIO_UCQ_PRIORITY 0x10
206
207
/*! AHB Gizmo registers. */
208
#define AHB_ARBITRATION_PRIORITY_CTRL 0x8
209
#define PRIORITY_CTRL_WEIGHT(x) (((x) & 7) << 29)
210
#define PRIORITY_SELECT_USB BIT(6) // USB-OTG.
211
#define PRIORITY_SELECT_USB2 BIT(18) // USB-HSIC.
212
#define PRIORITY_SELECT_USB3 BIT(17) // XUSB.
213
#define AHB_GIZMO_AHB_MEM 0x10
214
#define AHB_MEM_ENB_FAST_REARBITRATE BIT(2)
215
#define AHB_MEM_DONT_SPLIT_AHB_WR BIT(7)
216
#define AHB_MEM_IMMEDIATE BIT(18)
217
#define AHB_GIZMO_APB_DMA 0x14
218
#define AHB_GIZMO_USB 0x20
219
#define AHB_GIZMO_SDMMC4 0x48
220
#define AHB_GIZMO_USB2 0x7C
221
#define AHB_GIZMO_USB3 0x80 // Doesn't exist on T21x??
222
#define AHB_GIZMO_IMMEDIATE BIT(18)
223
#define AHB_ARBITRATION_XBAR_CTRL 0xE0
224
#define AHB_AHB_MEM_PREFETCH_CFG3 0xE4
225
#define AHB_AHB_MEM_PREFETCH_CFG4 0xE8
226
#define AHB_AHB_MEM_PREFETCH_CFG1 0xF0
227
#define AHB_AHB_MEM_PREFETCH_CFG2 0xF4
228
#define MST_ID(x) (((x) & 0x1F) << 26)
229
#define MEM_PREFETCH_AHBDMA_MST_ID MST_ID(5)
230
#define MEM_PREFETCH_USB_MST_ID MST_ID(6) // USB-OTG. Doesn't exist on T210B01.
231
#define MEM_PREFETCH_USB2_MST_ID MST_ID(18) // USB-HSIC. Doesn't exist on T210B01.
232
#define MEM_PREFETCH_USB3_MST_ID MST_ID(17) // XUSB. Doesn't exist on T210B01.
233
#define MEM_PREFETCH_ADDR_BNDRY(x) (((x) & 0xF) << 21)
234
#define MEM_PREFETCH_ENABLE BIT(31)
235
#define AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID 0xFC
236
#define MEM_WRQUE_SE_MST_ID BIT(14)
237
#define AHB_AHB_SPARE_REG 0x110
238
239
/*! Misc registers. */
240
#define APB_MISC_PP_STRAPPING_OPT_A 0x8
241
#define APB_MISC_PP_PINMUX_GLOBAL 0x40
242
#define APB_MISC_GP_HIDREV 0x804
243
#define GP_HIDREV_MAJOR_T210 0x1
244
#define GP_HIDREV_MAJOR_T210B01 0x2
245
#define APB_MISC_GP_ASDBGREG 0x810
246
#define APB_MISC_GP_TRANSACTOR_SCRATCH 0x864
247
#define APB_MISC_GP_AVP_TRANSACTOR_SCRATCH 0x880
248
#define APB_MISC_GP_CPU0_TRANSACTOR_SCRATCH 0x884
249
#define APB_MISC_GP_CPU1_TRANSACTOR_SCRATCH 0x888
250
#define APB_MISC_GP_CPU2_TRANSACTOR_SCRATCH 0x88C
251
#define APB_MISC_GP_CPU3_TRANSACTOR_SCRATCH 0x890
252
#define APB_MISC_GP_AUD_MCLK_CFGPADCTRL 0x8F4
253
#define APB_MISC_GP_LCD_BL_PWM_CFGPADCTRL 0xA34
254
#define APB_MISC_GP_SDMMC1_PAD_CFGPADCTRL 0xA98
255
#define APB_MISC_GP_EMMC2_PAD_CFGPADCTRL 0xA9C
256
#define APB_MISC_GP_EMMC4_PAD_CFGPADCTRL 0xAB4
257
#define APB_MISC_GP_EMMC4_PAD_PUPD_CFGPADCTRL 0xABC
258
#define APB_MISC_GP_DSI_PAD_CONTROL 0xAC0
259
#define APB_MISC_GP_WIFI_EN_CFGPADCTRL 0xB64
260
#define APB_MISC_GP_WIFI_RST_CFGPADCTRL 0xB68
261
262
/*! Secure boot registers. */
263
#define SB_CSR 0x0
264
#define SB_CSR_NS_RST_VEC_WR_DIS BIT(1)
265
#define SB_CSR_PIROM_DISABLE BIT(4)
266
#define SB_AA64_RESET_LOW 0x30
267
#define SB_AA64_RST_AARCH64_MODE_EN BIT(0)
268
#define SB_AA64_RESET_HIGH 0x34
269
270
/*! SOR registers. */
271
#define SOR_DP_HDCP_BKSV_LSB 0x1E8
272
#define SOR_TMDS_HDCP_BKSV_LSB 0x21C
273
#define SOR_TMDS_HDCP_CN_MSB 0x208
274
#define SOR_TMDS_HDCP_CN_LSB 0x20C
275
276
/*! RTC registers. */
277
#define APBDEV_RTC_SECONDS 0x8
278
#define APBDEV_RTC_SHADOW_SECONDS 0xC
279
#define APBDEV_RTC_MILLI_SECONDS 0x10
280
281
/*! SYSCTR0 registers. */
282
#define SYSCTR0_CNTCR 0x00
283
#define SYSCTR0_CNTFID0 0x20
284
#define SYSCTR0_COUNTERS_BASE 0xFD0
285
#define SYSCTR0_COUNTERS 12
286
#define SYSCTR0_COUNTERID0 0xFE0
287
#define SYSCTR0_COUNTERID1 0xFE4
288
#define SYSCTR0_COUNTERID2 0xFE8
289
#define SYSCTR0_COUNTERID3 0xFEC
290
#define SYSCTR0_COUNTERID4 0xFD0
291
#define SYSCTR0_COUNTERID5 0xFD4
292
#define SYSCTR0_COUNTERID6 0xFD8
293
#define SYSCTR0_COUNTERID7 0xFDC
294
#define SYSCTR0_COUNTERID8 0xFF0
295
#define SYSCTR0_COUNTERID9 0xFF4
296
#define SYSCTR0_COUNTERID10 0xFF8
297
#define SYSCTR0_COUNTERID11 0xFFC
298
299
/*! IPATCH registers. */
300
#define IPATCH_CAM_VALID 0x0
301
#define IPATCH_CAM_BASE 0x4
302
#define IPATCH_CAM(i) (IPATCH_CAM_BASE + (i) * 4)
303
#define IPATCH_CAM_ENTRIES 12
304
305
/*! I2S registers. */
306
#define I2S_CG 0x88
307
#define I2S_CTRL 0xA0
308
#define I2S1_CG I2S_CG
309
#define I2S1_CTRL I2S_CTRL
310
#define I2S2_CG 0x188
311
#define I2S2_CTRL 0x1A0
312
#define I2S3_CG 0x288
313
#define I2S3_CTRL 0x2A0
314
#define I2S4_CG 0x388
315
#define I2S4_CTRL 0x3A0
316
#define I2S5_CG 0x488
317
#define I2S5_CTRL 0x4A0
318
#define I2S_CG_SLCG_DISABLE 0
319
#define I2S_CG_SLCG_ENABLE BIT(0)
320
#define I2S_CTRL_MASTER_EN BIT(10)
321
322
/*! PWM registers. */
323
#define PWM_CONTROLLER_PWM_CSR_0 0x00
324
#define PWM_CONTROLLER_PWM_CSR_1 0x10
325
#define PWM_CSR_EN BIT(31)
326
327
/*! Special registers. */
328
#define EMC_SCRATCH0 0x324
329
#define EMC_HEKA_UPD BIT(30)
330
331
/*! Flow controller registers. */
332
#define FLOW_CTLR_HALT_COP_EVENTS 0x4
333
#define FLOW_CTLR_HALT_CPU0_EVENTS 0x0
334
#define FLOW_CTLR_HALT_CPU1_EVENTS 0x14
335
#define FLOW_CTLR_HALT_CPU2_EVENTS 0x1C
336
#define FLOW_CTLR_HALT_CPU3_EVENTS 0x24
337
#define HALT_GIC_IRQ BIT(9)
338
#define HALT_LIC_IRQ BIT(11)
339
#define HALT_SEC BIT(23)
340
#define HALT_MSEC BIT(24)
341
#define HALT_USEC BIT(25)
342
#define HALT_JTAG BIT(28)
343
#define HALT_MODE_NONE (0 << 29u)
344
#define HALT_MODE_RUN_AND_INT (1 << 29u)
345
#define HALT_MODE_WAITEVENT (2 << 29u)
346
#define HALT_MODE_WAITEVENT_AND_INT (3 << 29u)
347
#define HALT_MODE_STOP_UNTIL_IRQ (4 << 29u)
348
#define HALT_MODE_STOP_UNTIL_IRQ_AND_INT (5 << 29u)
349
#define HALT_MODE_STOP_UNTIL_EVENT_AND_IRQ (6 << 29u)
350
#define HALT_MAX_CNT 0xFF
351
#define FLOW_CTLR_COP_CSR 0xC
352
#define FLOW_CTLR_CPU0_CSR 0x8
353
#define FLOW_CTLR_CPU1_CSR 0x18
354
#define FLOW_CTLR_CPU2_CSR 0x20
355
#define FLOW_CTLR_CPU3_CSR 0x28
356
#define CSR_ENABLE BIT(0)
357
#define CSR_WAIT_WFI_NONE (0 << 8u)
358
#define CSR_WAIT_WFI_CPU0 (BIT(0) << 8u)
359
#define CSR_ENABLE_EXT_CPU_ONLY (0 << 12u)
360
#define CSR_ENABLE_EXT_CPU_NCPU (1 << 12u)
361
#define CSR_ENABLE_EXT_CPU_RAIL (2 << 12u)
362
#define CSR_EVENT_FLAG BIT(14)
363
#define CSR_INTR_FLAG BIT(15)
364
#define CSR_HALT BIT(22)
365
#define FLOW_CTLR_CPU_PWR_CSR 0x38
366
#define CPU_PWR_RAIL_STS_MASK (3 << 1u)
367
#define CPU_PWR_RAIL_OFF 0
368
#define FLOW_CTLR_RAM_REPAIR 0x40
369
#define RAM_REPAIR_REQ BIT(0)
370
#define RAM_REPAIR_STS BIT(1)
371
#define FLOW_CTLR_BPMP_CLUSTER_CONTROL 0x98
372
#define CLUSTER_CTRL_ACTIVE_SLOW BIT(0)
373
374
/* MSelect registers */
375
#define MSELECT_CONFIG 0x00
376
#define MSELECT_CFG_ERR_RESP_EN_PCIE BIT(24)
377
#define MSELECT_CFG_ERR_RESP_EN_GPU BIT(25)
378
#define MSELECT_CFG_WRAP_TO_INCR_BPMP BIT(27)
379
#define MSELECT_CFG_WRAP_TO_INCR_PCIE BIT(28)
380
#define MSELECT_CFG_WRAP_TO_INCR_GPU BIT(29)
381
382
/* NVDEC registers */
383
#define NVDEC_SA_KEYSLOT_FALCON 0x2100
384
#define NVDEC_SA_KEYSLOT_TZ 0x2104
385
#define NVDEC_SA_KEYSLOT_OTF 0x210C
386
#define NVDEC_SA_KEYSLOT_GLOBAL_RW 0x2118
387
#define NVDEC_VPR_ALL_OTF_GOTO_VPR 0x211C
388
389
/* PG registers */
390
#define PG_UP_TAG 0x0 // Changes depending on what does the reg read request.
391
#define TAG_PID_CCPLEX 0x55555555
392
#define TAG_PID_BPMP 0xAAAAAAAA
393
#define TAG_PID_COP2 0x99999999
394
#define TAG_PID_OTHER 0xCCCCCCCC
395
396
#endif
397
398