1 /*
2  * Copyright (c) 2019-2023 Arm Limited. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "common_target_cfg.h"
18 #include "Driver_MPC.h"
19 #include "Driver_PPC.h"
20 #include "device_definition.h"
21 #include "platform_description.h"
22 #include "region_defs.h"
23 #include "mpu_armv8m_drv.h"
24 #include "tfm_plat_defs.h"
25 #include "region.h"
26 
27 /* Debug configuration flags */
28 #define SPNIDEN_SEL_STATUS (0x01u << 7)
29 #define SPNIDEN_STATUS     (0x01u << 6)
30 #define SPIDEN_SEL_STATUS  (0x01u << 5)
31 #define SPIDEN_STATUS      (0x01u << 4)
32 #define NIDEN_SEL_STATUS   (0x01u << 3)
33 #define NIDEN_STATUS       (0x01u << 2)
34 #define DBGEN_SEL_STATUS   (0x01u << 1)
35 #define DBGEN_STATUS       (0x01u << 0)
36 
37 #define All_SEL_STATUS (SPNIDEN_SEL_STATUS | SPIDEN_SEL_STATUS | \
38                         NIDEN_SEL_STATUS | DBGEN_SEL_STATUS)
39 
40 static struct mpu_armv8m_dev_t dev_mpu = { MPU_BASE };
41 
42 /* Allows software, via SAU, to define the code region as a NSC */
43 #define NSCCFG_CODENSC  1
44 
45 extern const struct memory_region_limits memory_regions;
46 
47 /* Import MPC drivers */
48 extern ARM_DRIVER_MPC Driver_QSPI_MPC;
49 extern ARM_DRIVER_MPC Driver_ISRAM0_MPC;
50 extern ARM_DRIVER_MPC Driver_ISRAM1_MPC;
51 extern ARM_DRIVER_MPC Driver_ISRAM2_MPC;
52 extern ARM_DRIVER_MPC Driver_ISRAM3_MPC;
53 
54 /* Import PPC drivers */
55 extern ARM_DRIVER_PPC Driver_AHB_PPCEXP0;
56 extern ARM_DRIVER_PPC Driver_APB_PPC0;
57 extern ARM_DRIVER_PPC Driver_APB_PPC1;
58 extern ARM_DRIVER_PPC Driver_APB_PPCEXP0;
59 extern ARM_DRIVER_PPC Driver_APB_PPCEXP1;
60 extern ARM_DRIVER_PPC Driver_APB_PPCEXP2;
61 
62 /* Define Peripherals NS address range for the platform */
63 #define PERIPHERALS_BASE_NS_START      (0x40000000)
64 #define PERIPHERALS_BASE_NS_END        (0x4FFFFFFF)
65 
66 /* Enable system reset request for CPU 0 */
67 #define ENABLE_CPU0_SYSTEM_RESET_REQUEST (1U << 4U)
68 
69 /* To write into AIRCR register, 0x5FA value must be write to the VECTKEY field,
70  * otherwise the processor ignores the write.
71  */
72 #define SCB_AIRCR_WRITE_MASK ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos))
73 
74 struct platform_data_t tfm_peripheral_std_uart = {
75         UART1_BASE_S,
76         UART1_BASE_S + 0xFFF,
77         PPC_SP_APB_PPC_EXP2,
78         CMSDK_UART1_APB_PPC_POS
79 };
80 
81 static ARM_DRIVER_PPC *const ppc_bank_drivers[] = {
82     0,                      /* AHB PPC0 */
83     0,                      /* Reserved */
84     0,                      /* Reserved */
85     0,                      /* Reserved */
86     &Driver_AHB_PPCEXP0,    /* AHB PPCEXP0 */
87     0,                      /* AHB PPCEXP1 */
88     0,                      /* AHB PPCEXP2 */
89     0,                      /* AHB PPCEXP3 */
90     &Driver_APB_PPC0,       /* APB PPC0 */
91     &Driver_APB_PPC1,       /* APB PPC1 */
92     0,                      /* Reserved */
93     0,                      /* Reserved */
94     &Driver_APB_PPCEXP0,    /* APB PPCEXP0 */
95     &Driver_APB_PPCEXP1,    /* APB PPCEXP1 */
96     &Driver_APB_PPCEXP2,    /* APB PPCEXP2 */
97 };
98 
99 #define PPC_BANK_COUNT (sizeof(ppc_bank_drivers)/sizeof(ppc_bank_drivers[0]))
100 
101 struct platform_data_t tfm_peripheral_timer0 = {
102         CMSDK_TIMER0_BASE_S,
103         CMSDK_TIMER1_BASE_S - 1,
104         PPC_SP_APB_PPC0,
105         CMSDK_TIMER0_APB_PPC_POS
106 };
107 
enable_fault_handlers(void)108 enum tfm_plat_err_t enable_fault_handlers(void)
109 {
110     /* Explicitly set secure fault priority to the highest */
111     NVIC_SetPriority(SecureFault_IRQn, 0);
112 
113     /* Enables BUS, MEM, USG and Secure faults */
114     SCB->SHCSR |= (SCB_SHCSR_USGFAULTENA_Msk | SCB_SHCSR_BUSFAULTENA_Msk |
115                    SCB_SHCSR_MEMFAULTENA_Msk | SCB_SHCSR_SECUREFAULTENA_Msk);
116     return TFM_PLAT_ERR_SUCCESS;
117 }
118 
system_reset_cfg(void)119 enum tfm_plat_err_t system_reset_cfg(void)
120 {
121     struct sysctrl_t *sysctrl = (struct sysctrl_t *)CMSDK_SYSCTRL_BASE_S;
122     uint32_t reg_value = SCB->AIRCR;
123 
124     /* Enable system reset request for CPU 0, to be triggered via
125      * NVIC_SystemReset function.
126      */
127     sysctrl->resetmask |= ENABLE_CPU0_SYSTEM_RESET_REQUEST;
128 
129     /* Clear SCB_AIRCR_VECTKEY value */
130     reg_value &= ~(uint32_t)(SCB_AIRCR_VECTKEY_Msk);
131 
132     /* Enable system reset request only to the secure world */
133     reg_value |= (uint32_t)(SCB_AIRCR_WRITE_MASK | SCB_AIRCR_SYSRESETREQS_Msk);
134 
135     SCB->AIRCR = reg_value;
136 
137     return TFM_PLAT_ERR_SUCCESS;
138 }
139 
init_debug(void)140 enum tfm_plat_err_t init_debug(void)
141 {
142     volatile struct sysctrl_t *sys_ctrl =
143                                      (struct sysctrl_t *)CMSDK_SYSCTRL_BASE_S;
144 
145 #if defined(DAUTH_NONE)
146     /* Set all the debug enable selector bits to 1 */
147     sys_ctrl->secdbgset = All_SEL_STATUS;
148     /* Set all the debug enable bits to 0 */
149     sys_ctrl->secdbgclr =
150                    DBGEN_STATUS | NIDEN_STATUS | SPIDEN_STATUS | SPNIDEN_STATUS;
151 #elif defined(DAUTH_NS_ONLY)
152     /* Set all the debug enable selector bits to 1 */
153     sys_ctrl->secdbgset = All_SEL_STATUS;
154     /* Set the debug enable bits to 1 for NS, and 0 for S mode */
155     sys_ctrl->secdbgset = DBGEN_STATUS | NIDEN_STATUS;
156     sys_ctrl->secdbgclr = SPIDEN_STATUS | SPNIDEN_STATUS;
157 #elif defined(DAUTH_FULL)
158     /* Set all the debug enable selector bits to 1 */
159     sys_ctrl->secdbgset = All_SEL_STATUS;
160     /* Set all the debug enable bits to 1 */
161     sys_ctrl->secdbgset =
162                    DBGEN_STATUS | NIDEN_STATUS | SPIDEN_STATUS | SPNIDEN_STATUS;
163 #else
164 
165 #if !defined(DAUTH_CHIP_DEFAULT)
166 #error "No debug authentication setting is provided."
167 #endif
168 
169     /* Set all the debug enable selector bits to 0 */
170     sys_ctrl->secdbgclr = All_SEL_STATUS;
171 
172     /* No need to set any enable bits because the value depends on
173      * input signals.
174      */
175 #endif
176     return TFM_PLAT_ERR_SUCCESS;
177 }
178 
179 /*--------------------- NVIC interrupt NS/S configuration --------------------*/
nvic_interrupt_target_state_cfg(void)180 enum tfm_plat_err_t nvic_interrupt_target_state_cfg(void)
181 {
182     uint8_t i;
183 
184     /* Target every interrupt to NS; unimplemented interrupts will be WI */
185     for (i = 0; i < (sizeof(NVIC->ITNS) / sizeof(NVIC->ITNS[0])); i++) {
186         NVIC->ITNS[i] = 0xFFFFFFFF;
187     }
188 
189     /* Make sure that MPC and PPC are targeted to S state */
190     NVIC_ClearTargetState(MPC_IRQn);
191     NVIC_ClearTargetState(PPC_IRQn);
192 
193     return TFM_PLAT_ERR_SUCCESS;
194 }
195 
196 /*----------------- NVIC interrupt enabling for S peripherals ----------------*/
nvic_interrupt_enable(void)197 enum tfm_plat_err_t nvic_interrupt_enable(void)
198 {
199     int32_t ret = ARM_DRIVER_OK;
200     /* MPC interrupt enabling */
201     ret = Driver_QSPI_MPC.EnableInterrupt();
202     if (ret != ARM_DRIVER_OK) {
203         return TFM_PLAT_ERR_SYSTEM_ERR;
204     }
205     ret = Driver_ISRAM2_MPC.EnableInterrupt();
206     if (ret != ARM_DRIVER_OK) {
207         return TFM_PLAT_ERR_SYSTEM_ERR;
208     }
209     ret = Driver_ISRAM3_MPC.EnableInterrupt();
210     if (ret != ARM_DRIVER_OK) {
211         return TFM_PLAT_ERR_SYSTEM_ERR;
212     }
213     NVIC_EnableIRQ(MPC_IRQn);
214 
215     /* PPC interrupt enabling */
216     /* Clear pending PPC interrupts */
217     /* In the PPC configuration function, we have used the Non-Secure
218      * Privilege Control Block to grant unprivilged NS access to some
219      * peripherals used by NS. That triggers a PPC0 exception as that
220      * register is meant for NS privileged access only. Clear it here
221      */
222     Driver_APB_PPC0.ClearInterrupt();
223 
224     /* Enable PPC interrupts for APB PPC */
225     ret = Driver_APB_PPC0.EnableInterrupt();
226     if (ret != ARM_DRIVER_OK) {
227         return TFM_PLAT_ERR_SYSTEM_ERR;
228     }
229     ret = Driver_APB_PPC1.EnableInterrupt();
230     if (ret != ARM_DRIVER_OK) {
231         return TFM_PLAT_ERR_SYSTEM_ERR;
232     }
233     ret = Driver_APB_PPCEXP0.EnableInterrupt();
234     if (ret != ARM_DRIVER_OK) {
235         return TFM_PLAT_ERR_SYSTEM_ERR;
236     }
237     ret = Driver_APB_PPCEXP1.EnableInterrupt();
238     if (ret != ARM_DRIVER_OK) {
239         return TFM_PLAT_ERR_SYSTEM_ERR;
240     }
241     ret = Driver_APB_PPCEXP2.EnableInterrupt();
242     if (ret != ARM_DRIVER_OK) {
243         return TFM_PLAT_ERR_SYSTEM_ERR;
244     }
245 
246     NVIC_EnableIRQ(PPC_IRQn);
247 
248     return (enum tfm_plat_err_t) ARM_DRIVER_OK;
249 }
250 
251 /*------------------- SAU/IDAU configuration functions -----------------------*/
sau_and_idau_cfg(void)252 void sau_and_idau_cfg(void)
253 {
254     struct spctrl_def *spctrl = CMSDK_SPCTRL;
255 
256     /* Ensure all memory accesses are completed */
257     __DMB();
258 
259     /* Enables SAU */
260     TZ_SAU_Enable();
261 
262     /* Configures SAU regions to be non-secure */
263     SAU->RNR  = 0U;
264     SAU->RBAR = (memory_regions.non_secure_partition_base
265                  & SAU_RBAR_BADDR_Msk);
266     SAU->RLAR = (memory_regions.non_secure_partition_limit
267                   & SAU_RLAR_LADDR_Msk) | SAU_RLAR_ENABLE_Msk;
268 
269     SAU->RNR  = 1U;
270     SAU->RBAR = (NS_DATA_START & SAU_RBAR_BADDR_Msk);
271     SAU->RLAR = (NS_DATA_LIMIT & SAU_RLAR_LADDR_Msk) | SAU_RLAR_ENABLE_Msk;
272 
273     /* Configures veneers region to be non-secure callable */
274     SAU->RNR  = 2U;
275     SAU->RBAR = (memory_regions.veneer_base & SAU_RBAR_BADDR_Msk);
276     SAU->RLAR = (memory_regions.veneer_limit & SAU_RLAR_LADDR_Msk)
277                  | SAU_RLAR_ENABLE_Msk | SAU_RLAR_NSC_Msk;
278 
279     /* Configure the peripherals space */
280     SAU->RNR  = 3U;
281     SAU->RBAR = (PERIPHERALS_BASE_NS_START & SAU_RBAR_BADDR_Msk);
282     SAU->RLAR = (PERIPHERALS_BASE_NS_END & SAU_RLAR_LADDR_Msk)
283                   | SAU_RLAR_ENABLE_Msk;
284 #ifdef BL2
285     /* Secondary image partition */
286     SAU->RNR  = 4U;
287     /* TODO */
288     SAU->RBAR = (memory_regions.secondary_partition_base
289                  & SAU_RBAR_BADDR_Msk);
290     SAU->RLAR = (memory_regions.secondary_partition_limit
291                  & SAU_RLAR_LADDR_Msk) | SAU_RLAR_ENABLE_Msk;
292 #endif /* BL2 */
293 
294     /* Allows SAU to define the code region as a NSC */
295     spctrl->nsccfg |= NSCCFG_CODENSC;
296 
297     /* Ensure the write is completed and flush pipeline */
298     __DSB();
299     __ISB();
300 }
301 
302 /*------------------- Memory configuration functions -------------------------*/
mpc_init_cfg(void)303 enum tfm_plat_err_t mpc_init_cfg(void)
304 {
305     int32_t ret = ARM_DRIVER_OK;
306 
307     ret = Driver_QSPI_MPC.Initialize();
308     if (ret != ARM_DRIVER_OK) {
309         return ret;
310     }
311 
312     ret = Driver_QSPI_MPC.ConfigRegion(
313                     memory_regions.non_secure_partition_base,
314                     memory_regions.non_secure_partition_limit,
315                     ARM_MPC_ATTR_NONSECURE);
316     if (ret != ARM_DRIVER_OK) {
317         return ret;
318     }
319 #ifdef BL2
320     ret = Driver_QSPI_MPC.ConfigRegion(
321                     memory_regions.secondary_partition_base,
322                     memory_regions.secondary_partition_limit,
323                     ARM_MPC_ATTR_NONSECURE);
324     if (ret != ARM_DRIVER_OK) {
325         return ret;
326     }
327 #endif /* BL2 */
328 
329     /* SPE uses the first 96kB (3 ISRAM banks) for data */
330     ret = Driver_ISRAM0_MPC.Initialize();
331     if (ret != ARM_DRIVER_OK) {
332         return ret;
333     }
334 
335     ret = Driver_ISRAM0_MPC.ConfigRegion(
336                         MPC_ISRAM0_RANGE_BASE_S,
337                         MPC_ISRAM0_RANGE_LIMIT_S,
338                         ARM_MPC_ATTR_SECURE);
339     if (ret != ARM_DRIVER_OK) {
340         return ret;
341     }
342 
343     ret = Driver_ISRAM1_MPC.Initialize();
344     if (ret != ARM_DRIVER_OK) {
345         return ret;
346     }
347 
348     ret = Driver_ISRAM1_MPC.ConfigRegion(
349                         MPC_ISRAM1_RANGE_BASE_S,
350                         MPC_ISRAM1_RANGE_LIMIT_S,
351                         ARM_MPC_ATTR_SECURE);
352     if (ret != ARM_DRIVER_OK) {
353         return ret;
354     }
355 
356     ret = Driver_ISRAM2_MPC.Initialize();
357     if (ret != ARM_DRIVER_OK) {
358         return ret;
359     }
360 
361     ret = Driver_ISRAM2_MPC.ConfigRegion(
362                         MPC_ISRAM2_RANGE_BASE_S,
363                         MPC_ISRAM2_RANGE_LIMIT_S,
364                         ARM_MPC_ATTR_SECURE);
365     if (ret != ARM_DRIVER_OK) {
366         return ret;
367     }
368 
369     /* NSPE use the last 32KB (ISRAM 3) */
370     ret = Driver_ISRAM3_MPC.Initialize();
371     if (ret != ARM_DRIVER_OK) {
372         return ret;
373     }
374 
375     ret = Driver_ISRAM3_MPC.ConfigRegion(
376                         MPC_ISRAM3_RANGE_BASE_NS,
377                         MPC_ISRAM3_RANGE_LIMIT_NS,
378                         ARM_MPC_ATTR_NONSECURE);
379     if (ret != ARM_DRIVER_OK) {
380         return ret;
381     }
382 
383     /* Lock down the MPC configuration */
384     ret = Driver_QSPI_MPC.LockDown();
385     if (ret != ARM_DRIVER_OK) {
386         return ret;
387     }
388 
389     ret = Driver_ISRAM0_MPC.LockDown();
390     if (ret != ARM_DRIVER_OK) {
391         return ret;
392     }
393 
394     ret = Driver_ISRAM1_MPC.LockDown();
395     if (ret != ARM_DRIVER_OK) {
396         return ret;
397     }
398 
399     ret = Driver_ISRAM2_MPC.LockDown();
400     if (ret != ARM_DRIVER_OK) {
401         return ret;
402     }
403 
404     ret = Driver_ISRAM3_MPC.LockDown();
405     if (ret != ARM_DRIVER_OK) {
406         return ret;
407     }
408 
409     /* Add barriers to assure the MPC configuration is done before continue
410      * the execution.
411      */
412     __DSB();
413     __ISB();
414 
415     return TFM_PLAT_ERR_SUCCESS;
416 }
417 
mpc_revert_non_secure_to_secure_cfg(void)418 void mpc_revert_non_secure_to_secure_cfg(void)
419 {
420     Driver_ISRAM3_MPC.ConfigRegion(MPC_ISRAM3_RANGE_BASE_S,
421                                    MPC_ISRAM3_RANGE_LIMIT_S,
422                                    ARM_MPC_ATTR_SECURE);
423 
424     Driver_QSPI_MPC.ConfigRegion(MPC_QSPI_RANGE_BASE_S,
425                                  MPC_QSPI_RANGE_LIMIT_S,
426                                  ARM_MPC_ATTR_SECURE);
427 
428     /* Add barriers to assure the MPC configuration is done before continue
429      * the execution.
430      */
431     __DSB();
432     __ISB();
433 }
434 
mpc_clear_irq(void)435 void mpc_clear_irq(void)
436 {
437     Driver_QSPI_MPC.ClearInterrupt();
438     Driver_ISRAM0_MPC.ClearInterrupt();
439     Driver_ISRAM1_MPC.ClearInterrupt();
440     Driver_ISRAM2_MPC.ClearInterrupt();
441     Driver_ISRAM3_MPC.ClearInterrupt();
442 }
443 
444 /*------------------- PPC configuration functions -------------------------*/
ppc_init_cfg(void)445 enum tfm_plat_err_t ppc_init_cfg(void)
446 {
447     struct spctrl_def *spctrl = CMSDK_SPCTRL;
448     int32_t ret = ARM_DRIVER_OK;
449 
450     /* Grant non-secure access to peripherals in the PPC0
451      * (timer0 and 1, dualtimer, watchdog, mhu 0 and 1)
452      */
453     ret = Driver_APB_PPC0.Initialize();
454     if (ret != ARM_DRIVER_OK) {
455         return ret;
456     }
457 
458     ret = Driver_APB_PPC0.ConfigPeriph(CMSDK_TIMER0_APB_PPC_POS,
459                                     ARM_PPC_NONSECURE_ONLY,
460                                     ARM_PPC_PRIV_ONLY);
461     if (ret != ARM_DRIVER_OK) {
462         return ret;
463     }
464     ret = Driver_APB_PPC0.ConfigPeriph(CMSDK_TIMER1_APB_PPC_POS,
465                                     ARM_PPC_NONSECURE_ONLY,
466                                     ARM_PPC_PRIV_ONLY);
467     if (ret != ARM_DRIVER_OK) {
468         return ret;
469     }
470     ret = Driver_APB_PPC0.ConfigPeriph(CMSDK_DTIMER_APB_PPC_POS,
471                                     ARM_PPC_NONSECURE_ONLY,
472                                     ARM_PPC_PRIV_ONLY);
473     if (ret != ARM_DRIVER_OK) {
474         return ret;
475     }
476     ret = Driver_APB_PPC0.ConfigPeriph(CMSDK_MHU0_APB_PPC_POS,
477                                     ARM_PPC_NONSECURE_ONLY,
478                                     ARM_PPC_PRIV_ONLY);
479     if (ret != ARM_DRIVER_OK) {
480         return ret;
481     }
482     ret = Driver_APB_PPC0.ConfigPeriph(CMSDK_MHU0_APB_PPC_POS,
483                                     ARM_PPC_NONSECURE_ONLY,
484                                     ARM_PPC_PRIV_ONLY);
485 
486     ret = Driver_APB_PPC1.Initialize();
487     if (ret != ARM_DRIVER_OK) {
488         return ret;
489     }
490 
491     /* No peripherals are configured on APB PPC EXP0 but device needs to be
492      * initialialized so that the interrupt can be enabled later.
493      */
494     ret = Driver_APB_PPCEXP0.Initialize();
495     if (ret != ARM_DRIVER_OK) {
496         return ret;
497     }
498 
499     /* Grant non-secure access for APB peripherals on EXP1 */
500     ret = Driver_APB_PPCEXP1.Initialize();
501     if (ret != ARM_DRIVER_OK) {
502         return ret;
503     }
504     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_I2C0_APB_PPC_POS,
505                                         ARM_PPC_NONSECURE_ONLY,
506                                         ARM_PPC_PRIV_ONLY);
507     if (ret != ARM_DRIVER_OK) {
508         return ret;
509     }
510     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_I2C1_APB_PPC_POS,
511                                         ARM_PPC_NONSECURE_ONLY,
512                                         ARM_PPC_PRIV_ONLY);
513     if (ret != ARM_DRIVER_OK) {
514         return ret;
515     }
516     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_SPI0_APB_PPC_POS,
517                                         ARM_PPC_NONSECURE_ONLY,
518                                         ARM_PPC_PRIV_ONLY);
519     if (ret != ARM_DRIVER_OK) {
520         return ret;
521     }
522     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_SPI1_APB_PPC_POS,
523                                         ARM_PPC_NONSECURE_ONLY,
524                                         ARM_PPC_PRIV_ONLY);
525     if (ret != ARM_DRIVER_OK) {
526         return ret;
527     }
528     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_SPI2_APB_PPC_POS,
529                                         ARM_PPC_NONSECURE_ONLY,
530                                         ARM_PPC_PRIV_ONLY);
531     if (ret != ARM_DRIVER_OK) {
532         return ret;
533     }
534     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_I2C2_APB_PPC_POS,
535                                         ARM_PPC_NONSECURE_ONLY,
536                                         ARM_PPC_PRIV_ONLY);
537     if (ret != ARM_DRIVER_OK) {
538         return ret;
539     }
540     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_I2C3_APB_PPC_POS,
541                                         ARM_PPC_NONSECURE_ONLY,
542                                         ARM_PPC_PRIV_ONLY);
543     if (ret != ARM_DRIVER_OK) {
544         return ret;
545     }
546     ret = Driver_APB_PPCEXP1.ConfigPeriph(CMSDK_I2C4_APB_PPC_POS,
547                                         ARM_PPC_NONSECURE_ONLY,
548                                         ARM_PPC_PRIV_ONLY);
549     if (ret != ARM_DRIVER_OK) {
550         return ret;
551     }
552 
553     /* Grant non-secure access for APB peripherals on EXP2 */
554     ret = Driver_APB_PPCEXP2.Initialize();
555     if (ret != ARM_DRIVER_OK) {
556         return ret;
557     }
558     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_FPGA_SCC_PPC_POS,
559                                         ARM_PPC_NONSECURE_ONLY,
560                                         ARM_PPC_PRIV_ONLY);
561     if (ret != ARM_DRIVER_OK) {
562         return ret;
563     }
564     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_FPGA_AUDIO_PPC_POS,
565                                         ARM_PPC_NONSECURE_ONLY,
566                                         ARM_PPC_PRIV_ONLY);
567     if (ret != ARM_DRIVER_OK) {
568         return ret;
569     }
570     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_FPGA_IO_PPC_POS,
571                                         ARM_PPC_NONSECURE_ONLY,
572                                         ARM_PPC_PRIV_AND_NONPRIV);
573     if (ret != ARM_DRIVER_OK) {
574         return ret;
575     }
576     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART0_APB_PPC_POS,
577                                         ARM_PPC_NONSECURE_ONLY,
578                                         ARM_PPC_PRIV_ONLY);
579     if (ret != ARM_DRIVER_OK) {
580         return ret;
581     }
582     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART1_APB_PPC_POS,
583                                         ARM_PPC_NONSECURE_ONLY,
584                                         ARM_PPC_PRIV_ONLY);
585     if (ret != ARM_DRIVER_OK) {
586         return ret;
587     }
588     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART2_APB_PPC_POS,
589                                         ARM_PPC_NONSECURE_ONLY,
590                                         ARM_PPC_PRIV_ONLY);
591     if (ret != ARM_DRIVER_OK) {
592         return ret;
593     }
594     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART3_APB_PPC_POS,
595                                         ARM_PPC_NONSECURE_ONLY,
596                                         ARM_PPC_PRIV_ONLY);
597     if (ret != ARM_DRIVER_OK) {
598         return ret;
599     }
600     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART4_APB_PPC_POS,
601                                         ARM_PPC_NONSECURE_ONLY,
602                                         ARM_PPC_PRIV_ONLY);
603     if (ret != ARM_DRIVER_OK) {
604         return ret;
605     }
606     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_UART5_APB_PPC_POS,
607                                         ARM_PPC_NONSECURE_ONLY,
608                                         ARM_PPC_PRIV_ONLY);
609     if (ret != ARM_DRIVER_OK) {
610         return ret;
611     }
612     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_CLCD_APB_PPC_POS,
613                                         ARM_PPC_NONSECURE_ONLY,
614                                         ARM_PPC_PRIV_ONLY);
615     if (ret != ARM_DRIVER_OK) {
616         return ret;
617     }
618     ret = Driver_APB_PPCEXP2.ConfigPeriph(CMSDK_RTC_APB_PPC_POS,
619                                         ARM_PPC_NONSECURE_ONLY,
620                                         ARM_PPC_PRIV_ONLY);
621     if (ret != ARM_DRIVER_OK) {
622         return ret;
623     }
624 
625     /*
626      * Grant non-secure access to all peripherals on AHB EXP0:
627      * Make sure that all possible peripherals are enabled by default
628      */
629     ret = Driver_AHB_PPCEXP0.Initialize();
630     if (ret != ARM_DRIVER_OK) {
631         return ret;
632     }
633     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_GPIO0_PPC_POS,
634                                         ARM_PPC_NONSECURE_ONLY,
635                                         ARM_PPC_PRIV_ONLY);
636     if (ret != ARM_DRIVER_OK) {
637         return ret;
638     }
639     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_GPIO1_PPC_POS,
640                                         ARM_PPC_NONSECURE_ONLY,
641                                         ARM_PPC_PRIV_ONLY);
642     if (ret != ARM_DRIVER_OK) {
643         return ret;
644     }
645     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_GPIO2_PPC_POS,
646                                         ARM_PPC_NONSECURE_ONLY,
647                                         ARM_PPC_PRIV_ONLY);
648     if (ret != ARM_DRIVER_OK) {
649         return ret;
650     }
651     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_GPIO3_PPC_POS,
652                                         ARM_PPC_NONSECURE_ONLY,
653                                         ARM_PPC_PRIV_ONLY);
654     if (ret != ARM_DRIVER_OK) {
655         return ret;
656     }
657     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_USB_ETHERNET_PPC_POS,
658                                         ARM_PPC_NONSECURE_ONLY,
659                                         ARM_PPC_PRIV_ONLY);
660     if (ret != ARM_DRIVER_OK) {
661         return ret;
662     }
663     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_USER0_PPC_POS,
664                                         ARM_PPC_NONSECURE_ONLY,
665                                         ARM_PPC_PRIV_ONLY);
666     if (ret != ARM_DRIVER_OK) {
667         return ret;
668     }
669     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_USER1_PPC_POS,
670                                         ARM_PPC_NONSECURE_ONLY,
671                                         ARM_PPC_PRIV_ONLY);
672     if (ret != ARM_DRIVER_OK) {
673         return ret;
674     }
675     ret = Driver_AHB_PPCEXP0.ConfigPeriph(CMSDK_USER2_PPC_POS,
676                                         ARM_PPC_NONSECURE_ONLY,
677                                         ARM_PPC_PRIV_ONLY);
678     if (ret != ARM_DRIVER_OK) {
679         return ret;
680     }
681 
682     /*
683      * Configure the response to a security violation as a
684      * bus error instead of RAZ/WI
685      */
686     spctrl->secrespcfg |= CMSDK_SECRESPCFG_BUS_ERR_MASK;
687 
688     return TFM_PLAT_ERR_SUCCESS;
689 }
690 
ppc_configure_to_secure(ppc_bank_t bank,uint32_t pos)691 void ppc_configure_to_secure(ppc_bank_t bank, uint32_t pos)
692 {
693     ARM_DRIVER_PPC *ppc_driver;
694 
695     if (bank >= PPC_BANK_COUNT) {
696         return;
697     }
698 
699     ppc_driver = ppc_bank_drivers[bank];
700     if (ppc_driver) {
701         ppc_driver->ConfigPeriph(pos, ARM_PPC_SECURE_ONLY,
702                                       ARM_PPC_PRIV_ONLY);
703     }
704 }
705 
ppc_en_secure_unpriv(ppc_bank_t bank,uint32_t pos)706 void ppc_en_secure_unpriv(ppc_bank_t bank, uint32_t pos)
707 {
708     ARM_DRIVER_PPC *ppc_driver;
709 
710     if (bank >= PPC_BANK_COUNT) {
711         return;
712     }
713 
714     ppc_driver = ppc_bank_drivers[bank];
715     if (ppc_driver) {
716         ppc_driver->ConfigPeriph(pos, ARM_PPC_SECURE_ONLY,
717                                       ARM_PPC_PRIV_AND_NONPRIV);
718     }
719 }
720 
ppc_clr_secure_unpriv(ppc_bank_t bank,uint32_t pos)721 void ppc_clr_secure_unpriv(ppc_bank_t bank, uint32_t pos)
722 {
723     ppc_configure_to_secure(bank, pos);
724 }
725 
ppc_clear_irq(void)726 void ppc_clear_irq(void)
727 {
728     Driver_AHB_PPCEXP0.ClearInterrupt();
729     Driver_APB_PPC0.ClearInterrupt();
730     Driver_APB_PPC1.ClearInterrupt();
731     Driver_APB_PPCEXP0.ClearInterrupt();
732     Driver_APB_PPCEXP1.ClearInterrupt();
733     Driver_APB_PPCEXP2.ClearInterrupt();
734 }
735