101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/* 201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Copyright (c) 2014-2015, Linaro Ltd and Contributors. All rights reserved. 301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Copyright (c) 2014-2015, Hisilicon Ltd and Contributors. All rights reserved. 401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * 501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistribution and use in source and binary forms, with or without 601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * modification, are permitted provided that the following conditions are met: 701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * 801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistributions of source code must retain the above copyright notice, this 901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * list of conditions and the following disclaimer. 1001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * 1101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistributions in binary form must reproduce the above copyright notice, 1201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * this list of conditions and the following disclaimer in the documentation 1301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * and/or other materials provided with the distribution. 1401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * 1501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Neither the name of ARM nor the names of its contributors may be used 1601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * to endorse or promote products derived from this software without specific 1701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * prior written permission. 1801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * 1901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * POSSIBILITY OF SUCH DAMAGE. 3001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang */ 3101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 3201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <arch_helpers.h> 3301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <arm_gic.h> 3401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <assert.h> 3501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <bl_common.h> 3601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <debug.h> 3701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <mmio.h> 3801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <platform.h> 3901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <platform_def.h> 40ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#include <xlat_tables.h> 4101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <../hikey_def.h> 4201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 43ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_DEVICE MAP_REGION_FLAT(DEVICE_BASE, \ 44ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang DEVICE_SIZE, \ 45ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_DEVICE | MT_RW | MT_SECURE) 46ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 47ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_NS_DRAM MAP_REGION_FLAT(DRAM_NS_BASE, \ 48ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang DRAM_NS_SIZE, \ 49ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_DEVICE | MT_RW | MT_NS) 50ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 51158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#define MAP_TSP_MEM MAP_REGION_FLAT(TSP_SEC_MEM_BASE, \ 52158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong TSP_SEC_MEM_SIZE, \ 53158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong MT_MEMORY | MT_RW | MT_SECURE) 54158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong 55ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_ROM_PARAM MAP_REGION_FLAT(XG2RAM0_BASE, \ 56ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 0x1000, \ 57ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_DEVICE | MT_RW | MT_NS) 58ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 5908d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan#define MAP_SRAM MAP_REGION_FLAT(SRAM_BASE, \ 6008d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan SRAM_SIZE, \ 6108d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan MT_DEVICE | MT_RW | MT_SECURE) 6208d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan 63ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang/* 64ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * Table of regions for different BL stages to map using the MMU. 65ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * This doesn't include Trusted RAM as the 'mem_layout' argument passed to 66ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * configure_mmu_elx() will give the available subset of that, 67ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang */ 68ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL1 69ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = { 70ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_DEVICE, 71ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_NS_DRAM, 72ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_ROM_PARAM, 73ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang {0} 74ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang}; 75ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif 76ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL2 77ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = { 78ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_DEVICE, 79ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_NS_DRAM, 80158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong MAP_TSP_MEM, 8108d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan MAP_SRAM, 82ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang {0} 83ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang}; 84ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif 85ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL31 86ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = { 87ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_DEVICE, 88ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MAP_NS_DRAM, 89158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong MAP_TSP_MEM, 90c15ac82ebd42ece65700e462de57e4e6eb4badacLeo Yan MAP_SRAM, 91158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong {0} 92158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong}; 93158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#endif 94158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#if IMAGE_BL32 95158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chongstatic const mmap_region_t hikey_mmap[] = { 96158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong MAP_DEVICE, 97158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong MAP_NS_DRAM, 98ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang {0} 99ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang}; 100ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif 101ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 10201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/* Array of secure interrupts to be configured by the gic driver */ 10301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangconst unsigned int irq_sec_array[] = { 10401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_PHY_TIMER, 10501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_0, 10601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_1, 10701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_2, 10801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_3, 10901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_4, 11001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_5, 11101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_6, 11201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang IRQ_SEC_SGI_7 11301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang}; 11401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 11501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangconst unsigned int num_sec_irqs = sizeof(irq_sec_array) / 11601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang sizeof(irq_sec_array[0]); 11701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 11801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/******************************************************************************* 11901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Macro generating the code for the function setting up the pagetables as per 12001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * the platform memory map & initialize the mmu, for the given exception level 12101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang ******************************************************************************/ 122ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define DEFINE_CONFIGURE_MMU_EL(_el) \ 123ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang void configure_mmu_el##_el(unsigned long total_base, \ 124ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang unsigned long total_size, \ 125ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang unsigned long ro_start, \ 126ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang unsigned long ro_limit, \ 127ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang unsigned long coh_start, \ 128ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang unsigned long coh_limit) \ 129ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang { \ 130ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang mmap_add_region(total_base, total_base, \ 131ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang total_size, \ 132ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_MEMORY | MT_RW | MT_SECURE); \ 133ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang mmap_add_region(ro_start, ro_start, \ 134ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang ro_limit - ro_start, \ 135ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_MEMORY | MT_RO | MT_SECURE); \ 136ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang mmap_add_region(coh_start, coh_start, \ 137ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang coh_limit - coh_start, \ 138ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang MT_DEVICE | MT_RW | MT_SECURE); \ 139ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang mmap_add(hikey_mmap); \ 140ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang init_xlat_tables(); \ 141ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang \ 142ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang enable_mmu_el##_el(0); \ 143ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang } 144ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang 145ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang/* Define EL1 and EL3 variants of the function initialising the MMU */ 146ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian ZhuangDEFINE_CONFIGURE_MMU_EL(1) 147ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian ZhuangDEFINE_CONFIGURE_MMU_EL(3) 14801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 14901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangunsigned long plat_get_ns_image_entrypoint(void) 15001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{ 15101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang return NS_IMAGE_OFFSET; 15201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang} 15301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 15401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuanguint64_t plat_get_syscnt_freq(void) 15501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{ 15601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang return 1200000; 15701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang} 15801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang 15901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangvoid plat_gic_init(void) 16001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{ 16101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang arm_gic_init(GICC_BASE, GICD_BASE, 0, irq_sec_array, num_sec_irqs); 16201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang} 163