blob: 6b706be92c2b0c663039bd6a26b284c7c8667c4f [file] [log] [blame]
Dan Handley9df48042015-03-19 18:58:55 +00001/*
Roberto Vargas2ca18d92018-02-12 12:36:17 +00002 * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
Dan Handley9df48042015-03-19 18:58:55 +00003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Dan Handley9df48042015-03-19 18:58:55 +00005 */
6
7#include <arm_def.h>
Antonio Nino Diaz7289f922017-11-09 11:34:09 +00008#include <arm_spm_def.h>
Dan Handley9df48042015-03-19 18:58:55 +00009#include <debug.h>
Roberto Vargas2ca18d92018-02-12 12:36:17 +000010#include <plat_arm.h>
Dan Handley9df48042015-03-19 18:58:55 +000011#include <platform_def.h>
12#include <tzc400.h>
13
14
15/* Weak definitions may be overridden in specific ARM standard platform */
16#pragma weak plat_arm_security_setup
17
18
19/*******************************************************************************
20 * Initialize the TrustZone Controller for ARM standard platforms.
Sandrine Bailleux03897bb2015-11-26 16:31:34 +000021 * Configure:
22 * - Region 0 with no access;
23 * - Region 1 with secure access only;
24 * - the remaining DRAM regions access from the given Non-Secure masters.
25 *
26 * When booting an EL3 payload, this is simplified: we configure region 0 with
27 * secure access only and do not enable any other region.
Dan Handley9df48042015-03-19 18:58:55 +000028 ******************************************************************************/
Soby Mathew9c708b52016-02-26 14:23:19 +000029void arm_tzc400_setup(void)
Dan Handley9df48042015-03-19 18:58:55 +000030{
31 INFO("Configuring TrustZone Controller\n");
32
Soby Mathew9c708b52016-02-26 14:23:19 +000033 tzc400_init(PLAT_ARM_TZC_BASE);
Dan Handley9df48042015-03-19 18:58:55 +000034
35 /* Disable filters. */
Soby Mathew9c708b52016-02-26 14:23:19 +000036 tzc400_disable_filters();
Dan Handley9df48042015-03-19 18:58:55 +000037
Sandrine Bailleux03897bb2015-11-26 16:31:34 +000038#ifndef EL3_PAYLOAD_BASE
Soby Mathew7e4d6652017-05-10 11:50:30 +010039
Dan Handley9df48042015-03-19 18:58:55 +000040 /* Region 0 set to no access by default */
Soby Mathew9c708b52016-02-26 14:23:19 +000041 tzc400_configure_region0(TZC_REGION_S_NONE, 0);
Dan Handley9df48042015-03-19 18:58:55 +000042
43 /* Region 1 set to cover Secure part of DRAM */
Soby Mathew9c708b52016-02-26 14:23:19 +000044 tzc400_configure_region(PLAT_ARM_TZC_FILTERS, 1,
Soby Mathew3b5156e2017-10-05 12:27:33 +010045 ARM_AP_TZC_DRAM1_BASE, ARM_EL3_TZC_DRAM1_END,
Dan Handley9df48042015-03-19 18:58:55 +000046 TZC_REGION_S_RDWR,
47 0);
48
49 /* Region 2 set to cover Non-Secure access to 1st DRAM address range.
50 * Apply the same configuration to given filters in the TZC. */
Soby Mathew9c708b52016-02-26 14:23:19 +000051 tzc400_configure_region(PLAT_ARM_TZC_FILTERS, 2,
Dan Handley9df48042015-03-19 18:58:55 +000052 ARM_NS_DRAM1_BASE, ARM_NS_DRAM1_END,
Soby Mathew7e4d6652017-05-10 11:50:30 +010053 ARM_TZC_NS_DRAM_S_ACCESS,
Dan Handley9df48042015-03-19 18:58:55 +000054 PLAT_ARM_TZC_NS_DEV_ACCESS);
55
56 /* Region 3 set to cover Non-Secure access to 2nd DRAM address range */
Soby Mathew9c708b52016-02-26 14:23:19 +000057 tzc400_configure_region(PLAT_ARM_TZC_FILTERS, 3,
Dan Handley9df48042015-03-19 18:58:55 +000058 ARM_DRAM2_BASE, ARM_DRAM2_END,
Soby Mathew7e4d6652017-05-10 11:50:30 +010059 ARM_TZC_NS_DRAM_S_ACCESS,
Dan Handley9df48042015-03-19 18:58:55 +000060 PLAT_ARM_TZC_NS_DEV_ACCESS);
Antonio Nino Diaz7289f922017-11-09 11:34:09 +000061
62#if ENABLE_SPM
63 /*
64 * Region 4 set to cover Non-Secure access to the communication buffer
65 * shared with the Secure world.
66 */
67 tzc400_configure_region(PLAT_ARM_TZC_FILTERS,
68 4,
69 ARM_SP_IMAGE_NS_BUF_BASE,
70 (ARM_SP_IMAGE_NS_BUF_BASE +
71 ARM_SP_IMAGE_NS_BUF_SIZE) - 1,
72 TZC_REGION_S_NONE,
73 PLAT_ARM_TZC_NS_DEV_ACCESS);
74#endif
75
76#else /* if defined(EL3_PAYLOAD_BASE) */
77
Soby Mathew15b149e2017-11-13 08:29:45 +000078 /* Allow Secure and Non-secure access to DRAM for EL3 payloads */
79 tzc400_configure_region0(TZC_REGION_S_RDWR, PLAT_ARM_TZC_NS_DEV_ACCESS);
Antonio Nino Diaz7289f922017-11-09 11:34:09 +000080
Sandrine Bailleux03897bb2015-11-26 16:31:34 +000081#endif /* EL3_PAYLOAD_BASE */
Dan Handley9df48042015-03-19 18:58:55 +000082
83 /*
84 * Raise an exception if a NS device tries to access secure memory
85 * TODO: Add interrupt handling support.
86 */
Soby Mathew9c708b52016-02-26 14:23:19 +000087 tzc400_set_action(TZC_ACTION_ERR);
Dan Handley9df48042015-03-19 18:58:55 +000088
89 /* Enable filters. */
Soby Mathew9c708b52016-02-26 14:23:19 +000090 tzc400_enable_filters();
Dan Handley9df48042015-03-19 18:58:55 +000091}
92
93void plat_arm_security_setup(void)
94{
Soby Mathew9c708b52016-02-26 14:23:19 +000095 arm_tzc400_setup();
Dan Handley9df48042015-03-19 18:58:55 +000096}