Move FVP port to plat/arm/board/fvp
authorDan Handley <dan.handley@arm.com>
Mon, 27 Apr 2015 18:17:18 +0000 (19:17 +0100)
committerDan Handley <dan.handley@arm.com>
Tue, 28 Apr 2015 18:50:56 +0000 (19:50 +0100)
Move the FVP port from plat/fvp to plat/arm/board/fvp. Also rename
some of the files so they are consistently prefixed with fvp_.
Update the platform makefiles accordingly.

Change-Id: I7569affc3127d66405f1548fc81b878a858e61b7

38 files changed:
plat/arm/board/fvp/aarch64/fvp_common.c [new file with mode: 0644]
plat/arm/board/fvp/aarch64/fvp_helpers.S [new file with mode: 0644]
plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.c [new file with mode: 0644]
plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.h [new file with mode: 0644]
plat/arm/board/fvp/fvp_bl1_setup.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_bl2_setup.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_bl31_setup.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_def.h [new file with mode: 0644]
plat/arm/board/fvp/fvp_io_storage.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_pm.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_private.h [new file with mode: 0644]
plat/arm/board/fvp/fvp_security.c [new file with mode: 0644]
plat/arm/board/fvp/fvp_topology.c [new file with mode: 0644]
plat/arm/board/fvp/include/plat_macros.S [new file with mode: 0644]
plat/arm/board/fvp/include/platform_def.h [new file with mode: 0644]
plat/arm/board/fvp/include/platform_oid.h [new file with mode: 0644]
plat/arm/board/fvp/platform.mk [new file with mode: 0644]
plat/arm/board/fvp/tsp/fvp_tsp_setup.c [new file with mode: 0644]
plat/arm/board/fvp/tsp/tsp-fvp.mk [new file with mode: 0644]
plat/fvp/aarch64/fvp_common.c [deleted file]
plat/fvp/aarch64/fvp_helpers.S [deleted file]
plat/fvp/bl1_fvp_setup.c [deleted file]
plat/fvp/bl2_fvp_setup.c [deleted file]
plat/fvp/bl31_fvp_setup.c [deleted file]
plat/fvp/drivers/pwrc/fvp_pwrc.c [deleted file]
plat/fvp/drivers/pwrc/fvp_pwrc.h [deleted file]
plat/fvp/fvp_def.h [deleted file]
plat/fvp/fvp_io_storage.c [deleted file]
plat/fvp/fvp_pm.c [deleted file]
plat/fvp/fvp_private.h [deleted file]
plat/fvp/fvp_security.c [deleted file]
plat/fvp/fvp_topology.c [deleted file]
plat/fvp/include/plat_macros.S [deleted file]
plat/fvp/include/platform_def.h [deleted file]
plat/fvp/include/platform_oid.h [deleted file]
plat/fvp/platform.mk [deleted file]
plat/fvp/tsp/tsp-fvp.mk [deleted file]
plat/fvp/tsp/tsp_fvp_setup.c [deleted file]

diff --git a/plat/arm/board/fvp/aarch64/fvp_common.c b/plat/arm/board/fvp/aarch64/fvp_common.c
new file mode 100644 (file)
index 0000000..a876313
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arm_config.h>
+#include <arm_def.h>
+#include <arm_gic.h>
+#include <cci.h>
+#include <debug.h>
+#include <mmio.h>
+#include <plat_arm.h>
+#include <v2m_def.h>
+#include "../fvp_def.h"
+
+/*******************************************************************************
+ * arm_config holds the characteristics of the differences between the three FVP
+ * platforms (Base, A53_A57 & Foundation). It will be populated during cold boot
+ * at each boot stage by the primary before enabling the MMU (to allow cci
+ * configuration) & used thereafter. Each BL will have its own copy to allow
+ * independent operation.
+ ******************************************************************************/
+arm_config_t arm_config;
+
+#define MAP_DEVICE0    MAP_REGION_FLAT(DEVICE0_BASE,                   \
+                                       DEVICE0_SIZE,                   \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+#define MAP_DEVICE1    MAP_REGION_FLAT(DEVICE1_BASE,                   \
+                                       DEVICE1_SIZE,                   \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+/*
+ * Table of regions for various BL stages to map using the MMU.
+ * This doesn't include TZRAM as the 'mem_layout' argument passed to
+ * arm_configure_mmu_elx() will give the available subset of that,
+ */
+#if IMAGE_BL1
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_FLASH0,
+       V2M_MAP_IOFPGA,
+       MAP_DEVICE0,
+       MAP_DEVICE1,
+       {0}
+};
+#endif
+#if IMAGE_BL2
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_FLASH0,
+       V2M_MAP_IOFPGA,
+       MAP_DEVICE0,
+       MAP_DEVICE1,
+       ARM_MAP_NS_DRAM1,
+       ARM_MAP_TSP_SEC_MEM,
+       {0}
+};
+#endif
+#if IMAGE_BL31
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_IOFPGA,
+       MAP_DEVICE0,
+       MAP_DEVICE1,
+       {0}
+};
+#endif
+#if IMAGE_BL32
+const mmap_region_t plat_arm_mmap[] = {
+       V2M_MAP_IOFPGA,
+       MAP_DEVICE0,
+       MAP_DEVICE1,
+       {0}
+};
+#endif
+
+ARM_CASSERT_MMAP
+
+
+#if IMAGE_BL31 || IMAGE_BL32
+/* Array of secure interrupts to be configured by the gic driver */
+const unsigned int irq_sec_array[] = {
+       IRQ_TZ_WDOG,
+       ARM_IRQ_SEC_PHY_TIMER,
+       ARM_IRQ_SEC_SGI_0,
+       ARM_IRQ_SEC_SGI_1,
+       ARM_IRQ_SEC_SGI_2,
+       ARM_IRQ_SEC_SGI_3,
+       ARM_IRQ_SEC_SGI_4,
+       ARM_IRQ_SEC_SGI_5,
+       ARM_IRQ_SEC_SGI_6,
+       ARM_IRQ_SEC_SGI_7
+};
+
+void plat_arm_gic_init(void)
+{
+       arm_gic_init(arm_config.gicc_base,
+               arm_config.gicd_base,
+               BASE_GICR_BASE,
+               irq_sec_array,
+               ARRAY_SIZE(irq_sec_array));
+}
+
+#endif
+
+/*******************************************************************************
+ * A single boot loader stack is expected to work on both the Foundation FVP
+ * models and the two flavours of the Base FVP models (AEMv8 & Cortex). The
+ * SYS_ID register provides a mechanism for detecting the differences between
+ * these platforms. This information is stored in a per-BL array to allow the
+ * code to take the correct path.Per BL platform configuration.
+ ******************************************************************************/
+void fvp_config_setup(void)
+{
+       unsigned int rev, hbi, bld, arch, sys_id;
+
+       sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
+       rev = (sys_id >> V2M_SYS_ID_REV_SHIFT) & V2M_SYS_ID_REV_MASK;
+       hbi = (sys_id >> V2M_SYS_ID_HBI_SHIFT) & V2M_SYS_ID_HBI_MASK;
+       bld = (sys_id >> V2M_SYS_ID_BLD_SHIFT) & V2M_SYS_ID_BLD_MASK;
+       arch = (sys_id >> V2M_SYS_ID_ARCH_SHIFT) & V2M_SYS_ID_ARCH_MASK;
+
+       if (arch != ARCH_MODEL) {
+               ERROR("This firmware is for FVP models\n");
+               panic();
+       }
+
+       /*
+        * The build field in the SYS_ID tells which variant of the GIC
+        * memory is implemented by the model.
+        */
+       switch (bld) {
+       case BLD_GIC_VE_MMAP:
+               arm_config.gicd_base = VE_GICD_BASE;
+               arm_config.gicc_base = VE_GICC_BASE;
+               arm_config.gich_base = VE_GICH_BASE;
+               arm_config.gicv_base = VE_GICV_BASE;
+               break;
+       case BLD_GIC_A53A57_MMAP:
+               arm_config.gicd_base = BASE_GICD_BASE;
+               arm_config.gicc_base = BASE_GICC_BASE;
+               arm_config.gich_base = BASE_GICH_BASE;
+               arm_config.gicv_base = BASE_GICV_BASE;
+               break;
+       default:
+               ERROR("Unsupported board build %x\n", bld);
+               panic();
+       }
+
+       /*
+        * The hbi field in the SYS_ID is 0x020 for the Base FVP & 0x010
+        * for the Foundation FVP.
+        */
+       switch (hbi) {
+       case HBI_FOUNDATION_FVP:
+               arm_config.max_aff0 = 4;
+               arm_config.max_aff1 = 1;
+               arm_config.flags = 0;
+
+               /*
+                * Check for supported revisions of Foundation FVP
+                * Allow future revisions to run but emit warning diagnostic
+                */
+               switch (rev) {
+               case REV_FOUNDATION_FVP_V2_0:
+               case REV_FOUNDATION_FVP_V2_1:
+               case REV_FOUNDATION_FVP_v9_1:
+                       break;
+               default:
+                       WARN("Unrecognized Foundation FVP revision %x\n", rev);
+                       break;
+               }
+               break;
+       case HBI_BASE_FVP:
+               arm_config.max_aff0 = 4;
+               arm_config.max_aff1 = 2;
+               arm_config.flags |= ARM_CONFIG_BASE_MMAP |
+                       ARM_CONFIG_HAS_CCI | ARM_CONFIG_HAS_TZC;
+
+               /*
+                * Check for supported revisions
+                * Allow future revisions to run but emit warning diagnostic
+                */
+               switch (rev) {
+               case REV_BASE_FVP_V0:
+                       break;
+               default:
+                       WARN("Unrecognized Base FVP revision %x\n", rev);
+                       break;
+               }
+               break;
+       default:
+               ERROR("Unsupported board HBI number 0x%x\n", hbi);
+               panic();
+       }
+}
+
+
+void fvp_cci_init(void)
+{
+       /*
+        * Initialize CCI-400 driver
+        */
+       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
+               arm_cci_init();
+}
+
+void fvp_cci_enable(void)
+{
+       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
+               cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
+}
+
+void fvp_cci_disable(void)
+{
+       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
+               cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
+}
diff --git a/plat/arm/board/fvp/aarch64/fvp_helpers.S b/plat/arm/board/fvp/aarch64/fvp_helpers.S
new file mode 100644 (file)
index 0000000..dd56687
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <gic_v2.h>
+#include <platform_def.h>
+#include <v2m_def.h>
+#include "../drivers/pwrc/fvp_pwrc.h"
+#include "../fvp_def.h"
+
+       .globl  plat_secondary_cold_boot_setup
+       .globl  platform_get_entrypoint
+       .globl  platform_mem_init
+       .globl  platform_is_primary_cpu
+
+       .macro  fvp_choose_gicmmap  param1, param2, x_tmp, w_tmp, res
+       ldr     \x_tmp, =V2M_SYSREGS_BASE + V2M_SYS_ID
+       ldr     \w_tmp, [\x_tmp]
+       ubfx    \w_tmp, \w_tmp, #V2M_SYS_ID_BLD_SHIFT, #V2M_SYS_ID_BLD_LENGTH
+       cmp     \w_tmp, #BLD_GIC_VE_MMAP
+       csel    \res, \param1, \param2, eq
+       .endm
+
+       /* -----------------------------------------------------
+        * void plat_secondary_cold_boot_setup (void);
+        *
+        * This function performs any platform specific actions
+        * needed for a secondary cpu after a cold reset e.g
+        * mark the cpu's presence, mechanism to place it in a
+        * holding pen etc.
+        * TODO: Should we read the PSYS register to make sure
+        * that the request has gone through.
+        * -----------------------------------------------------
+        */
+func plat_secondary_cold_boot_setup
+       /* ---------------------------------------------
+        * Power down this cpu.
+        * TODO: Do we need to worry about powering the
+        * cluster down as well here. That will need
+        * locks which we won't have unless an elf-
+        * loader zeroes out the zi section.
+        * ---------------------------------------------
+        */
+       mrs     x0, mpidr_el1
+       ldr     x1, =PWRC_BASE
+       str     w0, [x1, #PPOFFR_OFF]
+
+       /* ---------------------------------------------
+        * Deactivate the gic cpu interface as well
+        * ---------------------------------------------
+        */
+       ldr     x0, =VE_GICC_BASE
+       ldr     x1, =BASE_GICC_BASE
+       fvp_choose_gicmmap      x0, x1, x2, w2, x1
+       mov     w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1)
+       orr     w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0)
+       str     w0, [x1, #GICC_CTLR]
+
+       /* ---------------------------------------------
+        * There is no sane reason to come out of this
+        * wfi so panic if we do. This cpu will be pow-
+        * ered on and reset by the cpu_on pm api
+        * ---------------------------------------------
+        */
+       dsb     sy
+       wfi
+cb_panic:
+       b       cb_panic
+endfunc plat_secondary_cold_boot_setup
+
+
+       /* -----------------------------------------------------
+        * void platform_get_entrypoint (unsigned int mpid);
+        *
+        * Main job of this routine is to distinguish between
+        * a cold and warm boot.
+        * On a cold boot the secondaries first wait for the
+        * platform to be initialized after which they are
+        * hotplugged in. The primary proceeds to perform the
+        * platform initialization.
+        * On a warm boot, each cpu jumps to the address in its
+        * mailbox.
+        *
+        * TODO: Not a good idea to save lr in a temp reg
+        * TODO: PSYSR is a common register and should be
+        *      accessed using locks. Since its not possible
+        *      to use locks immediately after a cold reset
+        *      we are relying on the fact that after a cold
+        *      reset all cpus will read the same WK field
+        * -----------------------------------------------------
+        */
+func platform_get_entrypoint
+       mov     x9, x30 // lr
+       mov     x2, x0
+       ldr     x1, =PWRC_BASE
+       str     w2, [x1, #PSYSR_OFF]
+       ldr     w2, [x1, #PSYSR_OFF]
+       ubfx    w2, w2, #PSYSR_WK_SHIFT, #PSYSR_WK_MASK
+       cmp     w2, #WKUP_PPONR
+       beq     warm_reset
+       cmp     w2, #WKUP_GICREQ
+       beq     warm_reset
+       mov     x0, #0
+       b       exit
+warm_reset:
+       /* ---------------------------------------------
+        * A per-cpu mailbox is maintained in the tru-
+        * sted DRAM. Its flushed out of the caches
+        * after every update using normal memory so
+        * its safe to read it here with SO attributes
+        * ---------------------------------------------
+        */
+       ldr     x10, =MBOX_BASE
+       bl      platform_get_core_pos
+       lsl     x0, x0, #ARM_CACHE_WRITEBACK_SHIFT
+       ldr     x0, [x10, x0]
+       cbz     x0, _panic
+exit:
+       ret     x9
+_panic:        b       _panic
+endfunc platform_get_entrypoint
+
+
+       /* -----------------------------------------------------
+        * void platform_mem_init (void);
+        *
+        * Zero out the mailbox registers in the shared memory.
+        * The mmu is turned off right now and only the primary can
+        * ever execute this code. Secondaries will read the
+        * mailboxes using SO accesses. In short, BL31 will
+        * update the mailboxes after mapping the tzdram as
+        * normal memory. It will flush its copy after update.
+        * BL1 will always read the mailboxes with the MMU off
+        * -----------------------------------------------------
+        */
+func platform_mem_init
+       ldr     x0, =MBOX_BASE
+       mov     w1, #PLATFORM_CORE_COUNT
+loop:
+       str     xzr, [x0], #CACHE_WRITEBACK_GRANULE
+       subs    w1, w1, #1
+       b.gt    loop
+       ret
+endfunc platform_mem_init
+
+
+func platform_is_primary_cpu
+       and     x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
+       cmp     x0, #FVP_PRIMARY_CPU
+       cset    x0, eq
+       ret
+endfunc platform_is_primary_cpu
diff --git a/plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.c b/plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.c
new file mode 100644 (file)
index 0000000..e004281
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <bakery_lock.h>
+#include <mmio.h>
+#include <plat_arm.h>
+#include "../../fvp_def.h"
+#include "../../fvp_private.h"
+#include "fvp_pwrc.h"
+
+/*
+ * TODO: Someday there will be a generic power controller api. At the moment
+ * each platform has its own pwrc so just exporting functions is fine.
+ */
+ARM_INSTANTIATE_LOCK
+
+unsigned int fvp_pwrc_get_cpu_wkr(unsigned long mpidr)
+{
+       return PSYSR_WK(fvp_pwrc_read_psysr(mpidr));
+}
+
+unsigned int fvp_pwrc_read_psysr(unsigned long mpidr)
+{
+       unsigned int rc;
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr);
+       rc = mmio_read_32(PWRC_BASE + PSYSR_OFF);
+       arm_lock_release();
+       return rc;
+}
+
+void fvp_pwrc_write_pponr(unsigned long mpidr)
+{
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr);
+       arm_lock_release();
+}
+
+void fvp_pwrc_write_ppoffr(unsigned long mpidr)
+{
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr);
+       arm_lock_release();
+}
+
+void fvp_pwrc_set_wen(unsigned long mpidr)
+{
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PWKUPR_OFF,
+                     (unsigned int) (PWKUPR_WEN | mpidr));
+       arm_lock_release();
+}
+
+void fvp_pwrc_clr_wen(unsigned long mpidr)
+{
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PWKUPR_OFF,
+                     (unsigned int) mpidr);
+       arm_lock_release();
+}
+
+void fvp_pwrc_write_pcoffr(unsigned long mpidr)
+{
+       arm_lock_get();
+       mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr);
+       arm_lock_release();
+}
+
+/* Nothing else to do here apart from initializing the lock */
+void plat_arm_pwrc_setup(void)
+{
+       arm_lock_init();
+}
+
+
+
diff --git a/plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.h b/plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.h
new file mode 100644 (file)
index 0000000..5b755af
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FVP_PWRC_H__
+#define __FVP_PWRC_H__
+
+/* FVP Power controller register offset etc */
+#define PPOFFR_OFF             0x0
+#define PPONR_OFF              0x4
+#define PCOFFR_OFF             0x8
+#define PWKUPR_OFF             0xc
+#define PSYSR_OFF              0x10
+
+#define PWKUPR_WEN             (1ull << 31)
+
+#define PSYSR_AFF_L2           (1 << 31)
+#define PSYSR_AFF_L1           (1 << 30)
+#define PSYSR_AFF_L0           (1 << 29)
+#define PSYSR_WEN              (1 << 28)
+#define PSYSR_PC               (1 << 27)
+#define PSYSR_PP               (1 << 26)
+
+#define PSYSR_WK_SHIFT         24
+#define PSYSR_WK_MASK          0x3
+#define PSYSR_WK(x)            (x >> PSYSR_WK_SHIFT) & PSYSR_WK_MASK
+
+#define WKUP_COLD              0x0
+#define WKUP_RESET             0x1
+#define WKUP_PPONR             0x2
+#define WKUP_GICREQ            0x3
+
+#define PSYSR_INVALID          0xffffffff
+
+#ifndef __ASSEMBLY__
+
+/*******************************************************************************
+ * Function & variable prototypes
+ ******************************************************************************/
+void fvp_pwrc_write_pcoffr(unsigned long);
+void fvp_pwrc_write_ppoffr(unsigned long);
+void fvp_pwrc_write_pponr(unsigned long);
+void fvp_pwrc_set_wen(unsigned long);
+void fvp_pwrc_clr_wen(unsigned long);
+unsigned int fvp_pwrc_read_psysr(unsigned long);
+unsigned int fvp_pwrc_get_cpu_wkr(unsigned long);
+
+#endif /*__ASSEMBLY__*/
+
+#endif /* __FVP_PWRC_H__ */
diff --git a/plat/arm/board/fvp/fvp_bl1_setup.c b/plat/arm/board/fvp/fvp_bl1_setup.c
new file mode 100644 (file)
index 0000000..33712d1
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <plat_arm.h>
+#include "fvp_private.h"
+
+
+/*******************************************************************************
+ * Perform any BL1 specific platform actions.
+ ******************************************************************************/
+void bl1_early_platform_setup(void)
+{
+       arm_bl1_early_platform_setup();
+
+       /* Initialize the platform config for future decision making */
+       fvp_config_setup();
+
+       /*
+        * Initialize CCI for this cluster during cold boot.
+        * No need for locks as no other CPU is active.
+        */
+       fvp_cci_init();
+       /*
+        * Enable CCI coherency for the primary CPU's cluster.
+        */
+       fvp_cci_enable();
+}
diff --git a/plat/arm/board/fvp/fvp_bl2_setup.c b/plat/arm/board/fvp/fvp_bl2_setup.c
new file mode 100644 (file)
index 0000000..a08f42c
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <plat_arm.h>
+#include "fvp_private.h"
+
+
+void bl2_early_platform_setup(meminfo_t *mem_layout)
+{
+       arm_bl2_early_platform_setup(mem_layout);
+
+       /* Initialize the platform config for future decision making */
+       fvp_config_setup();
+}
diff --git a/plat/arm/board/fvp/fvp_bl31_setup.c b/plat/arm/board/fvp/fvp_bl31_setup.c
new file mode 100644 (file)
index 0000000..b50ae55
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <plat_arm.h>
+#include "fvp_private.h"
+
+
+void bl31_early_platform_setup(bl31_params_t *from_bl2,
+                               void *plat_params_from_bl2)
+{
+       arm_bl31_early_platform_setup(from_bl2, plat_params_from_bl2);
+
+       /* Initialize the platform config for future decision making */
+       fvp_config_setup();
+
+       /*
+        * Initialize CCI for this cluster during cold boot.
+        * No need for locks as no other CPU is active.
+        */
+       fvp_cci_init();
+#if RESET_TO_BL31
+       /*
+        * Enable CCI coherency for the primary CPU's cluster
+        * (if earlier BL has not already done so).
+        * FVP PSCI code will enable coherency for other clusters.
+        */
+       fvp_cci_enable();
+
+#endif /* RESET_TO_BL31 */
+}
diff --git a/plat/arm/board/fvp/fvp_def.h b/plat/arm/board/fvp/fvp_def.h
new file mode 100644 (file)
index 0000000..47723c7
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FVP_DEF_H__
+#define __FVP_DEF_H__
+
+#include <arm_def.h>
+
+
+#define FVP_MAX_CPUS_PER_CLUSTER       4
+
+#define FVP_PRIMARY_CPU                        0x0
+
+/*******************************************************************************
+ * FVP memory map related constants
+ ******************************************************************************/
+
+#define FLASH1_BASE                    0x0c000000
+#define FLASH1_SIZE                    0x04000000
+
+#define PSRAM_BASE                     0x14000000
+#define PSRAM_SIZE                     0x04000000
+
+#define VRAM_BASE                      0x18000000
+#define VRAM_SIZE                      0x02000000
+
+/* Aggregate of all devices in the first GB */
+#define DEVICE0_BASE                   0x20000000
+#define DEVICE0_SIZE                   0x0c200000
+
+#define DEVICE1_BASE                   0x2f000000
+#define DEVICE1_SIZE                   0x200000
+
+#define NSRAM_BASE                     0x2e000000
+#define NSRAM_SIZE                     0x10000
+
+#define PCIE_EXP_BASE                  0x40000000
+#define TZRNG_BASE                     0x7fe60000
+#define TZNVCTR_BASE                   0x7fe70000
+#define TZROOTKEY_BASE                 0x7fe80000
+
+/* Constants to distinguish FVP type */
+#define HBI_BASE_FVP                   0x020
+#define REV_BASE_FVP_V0                        0x0
+
+#define HBI_FOUNDATION_FVP             0x010
+#define REV_FOUNDATION_FVP_V2_0                0x0
+#define REV_FOUNDATION_FVP_V2_1                0x1
+#define REV_FOUNDATION_FVP_v9_1                0x2
+
+#define BLD_GIC_VE_MMAP                        0x0
+#define BLD_GIC_A53A57_MMAP            0x1
+
+#define ARCH_MODEL                     0x1
+
+/* FVP Power controller base address*/
+#define PWRC_BASE                      0x1c100000
+
+
+/*******************************************************************************
+ * GIC-400 & interrupt handling related constants
+ ******************************************************************************/
+/* VE compatible GIC memory map */
+#define VE_GICD_BASE                   0x2c001000
+#define VE_GICC_BASE                   0x2c002000
+#define VE_GICH_BASE                   0x2c004000
+#define VE_GICV_BASE                   0x2c006000
+
+/* Base FVP compatible GIC memory map */
+#define BASE_GICD_BASE                 0x2f000000
+#define BASE_GICR_BASE                 0x2f100000
+#define BASE_GICC_BASE                 0x2c000000
+#define BASE_GICH_BASE                 0x2c010000
+#define BASE_GICV_BASE                 0x2c02f000
+
+#define IRQ_TZ_WDOG                    56
+
+
+/*******************************************************************************
+ * TrustZone address space controller related constants
+ ******************************************************************************/
+
+/* NSAIDs used by devices in TZC filter 0 on FVP */
+#define FVP_NSAID_DEFAULT              0
+#define FVP_NSAID_PCI                  1
+#define FVP_NSAID_VIRTIO               8  /* from FVP v5.6 onwards */
+#define FVP_NSAID_AP                   9  /* Application Processors */
+#define FVP_NSAID_VIRTIO_OLD           15 /* until FVP v5.5 */
+
+/* NSAIDs used by devices in TZC filter 2 on FVP */
+#define FVP_NSAID_HDLCD0               2
+#define FVP_NSAID_CLCD                 7
+
+/*******************************************************************************
+ *  Shared Data
+ ******************************************************************************/
+
+/* Entrypoint mailboxes */
+#define MBOX_BASE                      ARM_SHARED_RAM_BASE
+#define MBOX_SIZE                      0x200
+
+
+#endif /* __FVP_DEF_H__ */
diff --git a/plat/arm/board/fvp/fvp_io_storage.c b/plat/arm/board/fvp/fvp_io_storage.c
new file mode 100644 (file)
index 0000000..0284c3d
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <assert.h>
+#include <debug.h>
+#include <io_driver.h>
+#include <io_storage.h>
+#include <io_semihosting.h>
+#include <plat_arm.h>
+
+/* IO devices */
+static const io_dev_connector_t *sh_dev_con;
+static uintptr_t sh_dev_handle;
+
+
+static int open_semihosting(const uintptr_t spec)
+{
+       int result = IO_FAIL;
+       uintptr_t local_image_handle;
+
+       /* See if the file exists on semi-hosting.*/
+       result = io_dev_init(sh_dev_handle, (uintptr_t)NULL);
+       if (result == IO_SUCCESS) {
+               result = io_open(sh_dev_handle, spec, &local_image_handle);
+               if (result == IO_SUCCESS) {
+                       VERBOSE("Using Semi-hosting IO\n");
+                       io_close(local_image_handle);
+               }
+       }
+       return result;
+}
+
+void plat_arm_io_setup(void)
+{
+       int io_result;
+
+       arm_io_setup();
+
+       /* Register the additional IO devices on this platform */
+       io_result = register_io_dev_sh(&sh_dev_con);
+       assert(io_result == IO_SUCCESS);
+
+       /* Open connections to devices and cache the handles */
+       io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle);
+       assert(io_result == IO_SUCCESS);
+
+       /* Ignore improbable errors in release builds */
+       (void)io_result;
+}
+
+int plat_arm_get_alt_image_source(
+       const uintptr_t image_spec,
+       uintptr_t *dev_handle)
+{
+       int result = open_semihosting(image_spec);
+       if (result == IO_SUCCESS)
+               *dev_handle = sh_dev_handle;
+
+       return result;
+}
diff --git a/plat/arm/board/fvp/fvp_pm.c b/plat/arm/board/fvp/fvp_pm.c
new file mode 100644 (file)
index 0000000..b1431c4
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch_helpers.h>
+#include <arm_config.h>
+#include <arm_gic.h>
+#include <assert.h>
+#include <debug.h>
+#include <errno.h>
+#include <mmio.h>
+#include <platform.h>
+#include <plat_arm.h>
+#include <psci.h>
+#include <v2m_def.h>
+#include "drivers/pwrc/fvp_pwrc.h"
+#include "fvp_def.h"
+#include "fvp_private.h"
+
+
+typedef volatile struct mailbox {
+       unsigned long value __aligned(CACHE_WRITEBACK_GRANULE);
+} mailbox_t;
+
+/*******************************************************************************
+ * Private FVP function to program the mailbox for a cpu before it is released
+ * from reset.
+ ******************************************************************************/
+static void fvp_program_mailbox(uint64_t mpidr, uint64_t address)
+{
+       uint64_t linear_id;
+       mailbox_t *fvp_mboxes;
+
+       linear_id = platform_get_core_pos(mpidr);
+       fvp_mboxes = (mailbox_t *)MBOX_BASE;
+       fvp_mboxes[linear_id].value = address;
+       flush_dcache_range((unsigned long) &fvp_mboxes[linear_id],
+                          sizeof(unsigned long));
+}
+
+/*******************************************************************************
+ * Function which implements the common FVP specific operations to power down a
+ * cpu in response to a CPU_OFF or CPU_SUSPEND request.
+ ******************************************************************************/
+static void fvp_cpu_pwrdwn_common(void)
+{
+       /* Prevent interrupts from spuriously waking up this cpu */
+       arm_gic_cpuif_deactivate();
+
+       /* Program the power controller to power off this cpu. */
+       fvp_pwrc_write_ppoffr(read_mpidr_el1());
+}
+
+/*******************************************************************************
+ * Function which implements the common FVP specific operations to power down a
+ * cluster in response to a CPU_OFF or CPU_SUSPEND request.
+ ******************************************************************************/
+static void fvp_cluster_pwrdwn_common(void)
+{
+       uint64_t mpidr = read_mpidr_el1();
+
+       /* Disable coherency if this cluster is to be turned off */
+       fvp_cci_disable();
+
+       /* Program the power controller to turn the cluster off */
+       fvp_pwrc_write_pcoffr(mpidr);
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance is about to enter standby.
+ ******************************************************************************/
+void fvp_affinst_standby(unsigned int power_state)
+{
+       /*
+        * Enter standby state
+        * dsb is good practice before using wfi to enter low power states
+        */
+       dsb();
+       wfi();
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance is about to be turned on. The
+ * level and mpidr determine the affinity instance.
+ ******************************************************************************/
+int fvp_affinst_on(unsigned long mpidr,
+                  unsigned long sec_entrypoint,
+                  unsigned int afflvl,
+                  unsigned int state)
+{
+       int rc = PSCI_E_SUCCESS;
+       unsigned int psysr;
+
+       /*
+        * It's possible to turn on only affinity level 0 i.e. a cpu
+        * on the FVP. Ignore any other affinity level.
+        */
+       if (afflvl != MPIDR_AFFLVL0)
+               return rc;
+
+       /*
+        * Ensure that we do not cancel an inflight power off request
+        * for the target cpu. That would leave it in a zombie wfi.
+        * Wait for it to power off, program the jump address for the
+        * target cpu and then program the power controller to turn
+        * that cpu on
+        */
+       do {
+               psysr = fvp_pwrc_read_psysr(mpidr);
+       } while (psysr & PSYSR_AFF_L0);
+
+       fvp_program_mailbox(mpidr, sec_entrypoint);
+       fvp_pwrc_write_pponr(mpidr);
+
+       return rc;
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance is about to be turned off. The
+ * level and mpidr determine the affinity instance. The 'state' arg. allows the
+ * platform to decide whether the cluster is being turned off and take apt
+ * actions.
+ *
+ * CAUTION: There is no guarantee that caches will remain turned on across calls
+ * to this function as each affinity level is dealt with. So do not write & read
+ * global variables across calls. It will be wise to do flush a write to the
+ * global to prevent unpredictable results.
+ ******************************************************************************/
+void fvp_affinst_off(unsigned int afflvl,
+                   unsigned int state)
+{
+       /* Determine if any platform actions need to be executed */
+       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
+               return;
+
+       /*
+        * If execution reaches this stage then this affinity level will be
+        * suspended. Perform at least the cpu specific actions followed the
+        * cluster specific operations if applicable.
+        */
+       fvp_cpu_pwrdwn_common();
+
+       if (afflvl != MPIDR_AFFLVL0)
+               fvp_cluster_pwrdwn_common();
+
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance is about to be suspended. The
+ * level and mpidr determine the affinity instance. The 'state' arg. allows the
+ * platform to decide whether the cluster is being turned off and take apt
+ * actions.
+ *
+ * CAUTION: There is no guarantee that caches will remain turned on across calls
+ * to this function as each affinity level is dealt with. So do not write & read
+ * global variables across calls. It will be wise to do flush a write to the
+ * global to prevent unpredictable results.
+ ******************************************************************************/
+void fvp_affinst_suspend(unsigned long sec_entrypoint,
+                       unsigned int afflvl,
+                       unsigned int state)
+{
+       unsigned long mpidr;
+
+       /* Determine if any platform actions need to be executed. */
+       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
+               return;
+
+       /* Get the mpidr for this cpu */
+       mpidr = read_mpidr_el1();
+
+       /* Program the jump address for the this cpu */
+       fvp_program_mailbox(mpidr, sec_entrypoint);
+
+       /* Program the power controller to enable wakeup interrupts. */
+       fvp_pwrc_set_wen(mpidr);
+
+       /* Perform the common cpu specific operations */
+       fvp_cpu_pwrdwn_common();
+
+       /* Perform the common cluster specific operations */
+       if (afflvl != MPIDR_AFFLVL0)
+               fvp_cluster_pwrdwn_common();
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance has just been powered on after
+ * being turned off earlier. The level and mpidr determine the affinity
+ * instance. The 'state' arg. allows the platform to decide whether the cluster
+ * was turned off prior to wakeup and do what's necessary to setup it up
+ * correctly.
+ ******************************************************************************/
+void fvp_affinst_on_finish(unsigned int afflvl,
+                         unsigned int state)
+{
+       unsigned long mpidr;
+
+       /* Determine if any platform actions need to be executed. */
+       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
+               return;
+
+       /* Get the mpidr for this cpu */
+       mpidr = read_mpidr_el1();
+
+       /* Perform the common cluster specific operations */
+       if (afflvl != MPIDR_AFFLVL0) {
+               /*
+                * This CPU might have woken up whilst the cluster was
+                * attempting to power down. In this case the FVP power
+                * controller will have a pending cluster power off request
+                * which needs to be cleared by writing to the PPONR register.
+                * This prevents the power controller from interpreting a
+                * subsequent entry of this cpu into a simple wfi as a power
+                * down request.
+                */
+               fvp_pwrc_write_pponr(mpidr);
+
+               /* Enable coherency if this cluster was off */
+               fvp_cci_enable();
+       }
+
+       /*
+        * Clear PWKUPR.WEN bit to ensure interrupts do not interfere
+        * with a cpu power down unless the bit is set again
+        */
+       fvp_pwrc_clr_wen(mpidr);
+
+       /* Zero the jump address in the mailbox for this cpu */
+       fvp_program_mailbox(mpidr, 0);
+
+       /* Enable the gic cpu interface */
+       arm_gic_cpuif_setup();
+
+       /* TODO: This setup is needed only after a cold boot */
+       arm_gic_pcpu_distif_setup();
+}
+
+/*******************************************************************************
+ * FVP handler called when an affinity instance has just been powered on after
+ * having been suspended earlier. The level and mpidr determine the affinity
+ * instance.
+ * TODO: At the moment we reuse the on finisher and reinitialize the secure
+ * context. Need to implement a separate suspend finisher.
+ ******************************************************************************/
+void fvp_affinst_suspend_finish(unsigned int afflvl,
+                              unsigned int state)
+{
+       fvp_affinst_on_finish(afflvl, state);
+}
+
+/*******************************************************************************
+ * FVP handlers to shutdown/reboot the system
+ ******************************************************************************/
+static void __dead2 fvp_system_off(void)
+{
+       /* Write the System Configuration Control Register */
+       mmio_write_32(V2M_SYSREGS_BASE + V2M_SYS_CFGCTRL,
+               V2M_CFGCTRL_START |
+               V2M_CFGCTRL_RW |
+               V2M_CFGCTRL_FUNC(V2M_FUNC_SHUTDOWN));
+       wfi();
+       ERROR("FVP System Off: operation not handled.\n");
+       panic();
+}
+
+static void __dead2 fvp_system_reset(void)
+{
+       /* Write the System Configuration Control Register */
+       mmio_write_32(V2M_SYSREGS_BASE + V2M_SYS_CFGCTRL,
+               V2M_CFGCTRL_START |
+               V2M_CFGCTRL_RW |
+               V2M_CFGCTRL_FUNC(V2M_FUNC_REBOOT));
+       wfi();
+       ERROR("FVP System Reset: operation not handled.\n");
+       panic();
+}
+
+/*******************************************************************************
+ * Export the platform handlers to enable psci to invoke them
+ ******************************************************************************/
+static const plat_pm_ops_t fvp_plat_pm_ops = {
+       .affinst_standby = fvp_affinst_standby,
+       .affinst_on = fvp_affinst_on,
+       .affinst_off = fvp_affinst_off,
+       .affinst_suspend = fvp_affinst_suspend,
+       .affinst_on_finish = fvp_affinst_on_finish,
+       .affinst_suspend_finish = fvp_affinst_suspend_finish,
+       .system_off = fvp_system_off,
+       .system_reset = fvp_system_reset,
+       .validate_power_state = arm_validate_power_state
+};
+
+/*******************************************************************************
+ * Export the platform specific power ops & initialize the fvp power controller
+ ******************************************************************************/
+int platform_setup_pm(const plat_pm_ops_t **plat_ops)
+{
+       *plat_ops = &fvp_plat_pm_ops;
+       return 0;
+}
diff --git a/plat/arm/board/fvp/fvp_private.h b/plat/arm/board/fvp/fvp_private.h
new file mode 100644 (file)
index 0000000..e88a45e
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FVP_PRIVATE_H__
+#define __FVP_PRIVATE_H__
+
+#include <plat_arm.h>
+
+/*******************************************************************************
+ * Function and variable prototypes
+ ******************************************************************************/
+
+void fvp_config_setup(void);
+
+void fvp_cci_init(void);
+void fvp_cci_enable(void);
+void fvp_cci_disable(void);
+
+
+#endif /* __FVP_PRIVATE_H__ */
diff --git a/plat/arm/board/fvp/fvp_security.c b/plat/arm/board/fvp/fvp_security.c
new file mode 100644 (file)
index 0000000..0cf8450
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arm_config.h>
+#include <plat_arm.h>
+
+/*
+ * We assume that all security programming is done by the primary core.
+ */
+void plat_arm_security_setup(void)
+{
+       /*
+        * The Base FVP has a TrustZone address space controller, the Foundation
+        * FVP does not. Trying to program the device on the foundation FVP will
+        * cause an abort.
+        *
+        * If the platform had additional peripheral specific security
+        * configurations, those would be configured here.
+        */
+
+       if (get_arm_config()->flags & ARM_CONFIG_HAS_TZC)
+               arm_tzc_setup();
+}
diff --git a/plat/arm/board/fvp/fvp_topology.c b/plat/arm/board/fvp/fvp_topology.c
new file mode 100644 (file)
index 0000000..168864a
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch.h>
+#include <assert.h>
+#include <platform_def.h>
+/* TODO: Reusing psci error codes & state information. Get our own! */
+#include <psci.h>
+#include "drivers/pwrc/fvp_pwrc.h"
+#include "fvp_def.h"
+
+/* We treat '255' as an invalid affinity instance */
+#define AFFINST_INVAL  0xff
+
+/*******************************************************************************
+ * We support 3 flavours of the FVP: Foundation, Base AEM & Base Cortex. Each
+ * flavour has a different topology. The common bit is that there can be a max.
+ * of 2 clusters (affinity 1) and 4 cpus (affinity 0) per cluster. So we define
+ * a tree like data structure which caters to these maximum bounds. It simply
+ * marks the absent affinity level instances as PSCI_AFF_ABSENT e.g. there is no
+ * cluster 1 on the Foundation FVP. The 'data' field is currently unused.
+ ******************************************************************************/
+typedef struct affinity_info {
+       unsigned char sibling;
+       unsigned char child;
+       unsigned char state;
+       unsigned int data;
+} affinity_info_t;
+
+/*******************************************************************************
+ * The following two data structures store the topology tree for the fvp. There
+ * is a separate array for each affinity level i.e. cpus and clusters. The child
+ * and sibling references allow traversal inside and in between the two arrays.
+ ******************************************************************************/
+static affinity_info_t fvp_aff1_topology_map[ARM_CLUSTER_COUNT];
+static affinity_info_t fvp_aff0_topology_map[PLATFORM_CORE_COUNT];
+
+/* Simple global variable to safeguard us from stupidity */
+static unsigned int topology_setup_done;
+
+/*******************************************************************************
+ * This function implements a part of the critical interface between the psci
+ * generic layer and the platform to allow the former to detect the platform
+ * topology. psci queries the platform to determine how many affinity instances
+ * are present at a particular level for a given mpidr e.g. consider a dual
+ * cluster platform where each cluster has 4 cpus. A call to this function with
+ * (0, 0x100) will return the number of cpus implemented under cluster 1 i.e. 4.
+ * Similarly a call with (1, 0x100) will return 2 i.e. the number of clusters.
+ * This is 'cause we are effectively asking how many affinity level 1 instances
+ * are implemented under affinity level 2 instance 0.
+ ******************************************************************************/
+unsigned int plat_get_aff_count(unsigned int aff_lvl,
+                               unsigned long mpidr)
+{
+       unsigned int aff_count = 1, ctr;
+       unsigned char parent_aff_id;
+
+       assert(topology_setup_done == 1);
+
+       switch (aff_lvl) {
+       case 3:
+       case 2:
+               /*
+                * Assert if the parent affinity instance is not 0.
+                * This also takes care of level 3 in an obfuscated way
+                */
+               parent_aff_id = (mpidr >> MPIDR_AFF3_SHIFT) & MPIDR_AFFLVL_MASK;
+               assert(parent_aff_id == 0);
+
+               /*
+                * Report that we implement a single instance of
+                * affinity levels 2 & 3 which are AFF_ABSENT
+                */
+               break;
+       case 1:
+               /* Assert if the parent affinity instance is not 0. */
+               parent_aff_id = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
+               assert(parent_aff_id == 0);
+
+               /* Fetch the starting index in the aff1 array */
+               for (ctr = 0;
+                    fvp_aff1_topology_map[ctr].sibling != AFFINST_INVAL;
+                    ctr = fvp_aff1_topology_map[ctr].sibling) {
+                       aff_count++;
+               }
+
+               break;
+       case 0:
+               /* Assert if the cluster id is anything apart from 0 or 1 */
+               parent_aff_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+               assert(parent_aff_id < ARM_CLUSTER_COUNT);
+
+               /* Fetch the starting index in the aff0 array */
+               for (ctr = fvp_aff1_topology_map[parent_aff_id].child;
+                    fvp_aff0_topology_map[ctr].sibling != AFFINST_INVAL;
+                    ctr = fvp_aff0_topology_map[ctr].sibling) {
+                       aff_count++;
+               }
+
+               break;
+       default:
+               assert(0);
+       }
+
+       return aff_count;
+}
+
+/*******************************************************************************
+ * This function implements a part of the critical interface between the psci
+ * generic layer and the platform to allow the former to detect the state of a
+ * affinity instance in the platform topology. psci queries the platform to
+ * determine whether an affinity instance is present or absent. This caters for
+ * topologies where an intermediate affinity level instance is missing e.g.
+ * consider a platform which implements a single cluster with 4 cpus and there
+ * is another cpu sitting directly on the interconnect along with the cluster.
+ * The mpidrs of the cluster would range from 0x0-0x3. The mpidr of the single
+ * cpu would be 0x100 to highlight that it does not belong to cluster 0. Cluster
+ * 1 is however missing but needs to be accounted to reach this single cpu in
+ * the topology tree. Hence it will be marked as PSCI_AFF_ABSENT. This is not
+ * applicable to the FVP but depicted as an example.
+ ******************************************************************************/
+unsigned int plat_get_aff_state(unsigned int aff_lvl,
+                               unsigned long mpidr)
+{
+       unsigned int aff_state = PSCI_AFF_ABSENT, idx;
+       idx = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+
+       assert(topology_setup_done == 1);
+
+       switch (aff_lvl) {
+       case 3:
+       case 2:
+               /* Report affinity levels 2 & 3 as absent */
+               break;
+       case 1:
+               aff_state = fvp_aff1_topology_map[idx].state;
+               break;
+       case 0:
+               /*
+                * First get start index of the aff0 in its array & then add
+                * to it the affinity id that we want the state of
+                */
+               idx = fvp_aff1_topology_map[idx].child;
+               idx += (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
+               aff_state = fvp_aff0_topology_map[idx].state;
+               break;
+       default:
+               assert(0);
+       }
+
+       return aff_state;
+}
+
+/*******************************************************************************
+ * This function populates the FVP specific topology information depending upon
+ * the FVP flavour its running on. We construct all the mpidrs we can handle
+ * and rely on the PWRC.PSYSR to flag absent cpus when their status is queried.
+ ******************************************************************************/
+int plat_arm_topology_setup(void)
+{
+       unsigned char aff0, aff1, aff_state, aff0_offset = 0;
+       unsigned long mpidr;
+
+       topology_setup_done = 0;
+
+       for (aff1 = 0; aff1 < ARM_CLUSTER_COUNT; aff1++) {
+
+               fvp_aff1_topology_map[aff1].child = aff0_offset;
+               fvp_aff1_topology_map[aff1].sibling = aff1 + 1;
+
+               for (aff0 = 0; aff0 < FVP_MAX_CPUS_PER_CLUSTER; aff0++) {
+
+                       mpidr = aff1 << MPIDR_AFF1_SHIFT;
+                       mpidr |= aff0 << MPIDR_AFF0_SHIFT;
+
+                       if (fvp_pwrc_read_psysr(mpidr) != PSYSR_INVALID) {
+                               /*
+                                * Presence of even a single aff0 indicates
+                                * presence of parent aff1 on the FVP.
+                                */
+                               aff_state = PSCI_AFF_PRESENT;
+                               fvp_aff1_topology_map[aff1].state =
+                                       PSCI_AFF_PRESENT;
+                       } else {
+                               aff_state = PSCI_AFF_ABSENT;
+                       }
+
+                       fvp_aff0_topology_map[aff0_offset].child = AFFINST_INVAL;
+                       fvp_aff0_topology_map[aff0_offset].state = aff_state;
+                       fvp_aff0_topology_map[aff0_offset].sibling =
+                               aff0_offset + 1;
+
+                       /* Increment the absolute number of aff0s traversed */
+                       aff0_offset++;
+               }
+
+               /* Tie-off the last aff0 sibling to -1 to avoid overflow */
+               fvp_aff0_topology_map[aff0_offset - 1].sibling = AFFINST_INVAL;
+       }
+
+       /* Tie-off the last aff1 sibling to AFFINST_INVAL to avoid overflow */
+       fvp_aff1_topology_map[aff1 - 1].sibling = AFFINST_INVAL;
+
+       topology_setup_done = 1;
+       return 0;
+}
diff --git a/plat/arm/board/fvp/include/plat_macros.S b/plat/arm/board/fvp/include/plat_macros.S
new file mode 100644 (file)
index 0000000..2feffbe
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __PLAT_MACROS_S__
+#define __PLAT_MACROS_S__
+
+#include <arm_macros.S>
+#include <v2m_def.h>
+#include "../fvp_def.h"
+
+       /* ---------------------------------------------
+        * The below required platform porting macro
+        * prints out relevant GIC registers whenever an
+        * unhandled exception is taken in BL3-1.
+        * Clobbers: x0 - x10, x16, x17, sp
+        * ---------------------------------------------
+        */
+       .macro plat_print_gic_regs
+       /*
+        * Detect if we're using the base memory map or
+        * the legacy VE memory map
+        */
+       mov_imm x0, (V2M_SYSREGS_BASE + V2M_SYS_ID)
+       ldr     w16, [x0]
+       /* Extract BLD (12th - 15th bits) from the SYS_ID */
+       ubfx    x16, x16, #V2M_SYS_ID_BLD_SHIFT, #4
+       /* Check if VE mmap */
+       cmp     w16, #BLD_GIC_VE_MMAP
+       b.eq    use_ve_mmap
+       /* Check if Cortex-A53/A57 mmap */
+       cmp     w16, #BLD_GIC_A53A57_MMAP
+       b.ne    exit_print_gic_regs
+       mov_imm x17, BASE_GICC_BASE
+       mov_imm x16, BASE_GICD_BASE
+       b       print_gicc_regs
+use_ve_mmap:
+       mov_imm x17, VE_GICC_BASE
+       mov_imm x16, VE_GICD_BASE
+print_gicc_regs:
+       arm_print_gic_regs
+       .endm
+
+#endif /* __PLAT_MACROS_S__ */
diff --git a/plat/arm/board/fvp/include/platform_def.h b/plat/arm/board/fvp/include/platform_def.h
new file mode 100644 (file)
index 0000000..c2a7d6a
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __PLATFORM_DEF_H__
+#define __PLATFORM_DEF_H__
+
+#include <arm_def.h>
+#include <board_arm_def.h>
+#include <common_def.h>
+#include <tzc400.h>
+#include <v2m_def.h>
+#include "../fvp_def.h"
+
+
+/*
+ * Most platform porting definitions provided by included headers
+ */
+
+/*
+ * Required ARM standard platform porting definitions
+ */
+#define PLAT_ARM_CLUSTER0_CORE_COUNT   4
+#define PLAT_ARM_CLUSTER1_CORE_COUNT   4
+
+#define PLAT_ARM_TRUSTED_ROM_BASE      0x00000000
+#define PLAT_ARM_TRUSTED_ROM_SIZE      0x04000000      /* 64 MB */
+
+#define PLAT_ARM_TRUSTED_DRAM_BASE     0x06000000
+#define PLAT_ARM_TRUSTED_DRAM_SIZE     0x02000000      /* 32 MB */
+
+/* No SCP in FVP */
+#define PLAT_ARM_SCP_TZC_DRAM1_SIZE    MAKE_ULL(0x0)
+
+#define PLAT_ARM_DRAM2_SIZE            MAKE_ULL(0x780000000)
+
+#define PLAT_ARM_SHARED_RAM_CACHED     1
+
+/*
+ * Load address of BL3-3 for this platform port
+ */
+#define PLAT_ARM_NS_IMAGE_OFFSET       (ARM_DRAM1_BASE + 0x8000000)
+
+
+/*
+ * PL011 related constants
+ */
+#define PLAT_ARM_BOOT_UART_BASE                V2M_IOFPGA_UART0_BASE
+#define PLAT_ARM_BOOT_UART_CLK_IN_HZ   V2M_IOFPGA_UART0_CLK_IN_HZ
+
+#define PLAT_ARM_CRASH_UART_BASE       V2M_IOFPGA_UART1_BASE
+#define PLAT_ARM_CRASH_UART_CLK_IN_HZ  V2M_IOFPGA_UART1_CLK_IN_HZ
+
+#define PLAT_ARM_TSP_UART_BASE         V2M_IOFPGA_UART2_BASE
+#define PLAT_ARM_TSP_UART_CLK_IN_HZ    V2M_IOFPGA_UART2_CLK_IN_HZ
+
+/* CCI related constants */
+#define PLAT_ARM_CCI_BASE              0x2c090000
+#define PLAT_ARM_CCI_CLUSTER0_SL_IFACE_IX      3
+#define PLAT_ARM_CCI_CLUSTER1_SL_IFACE_IX      4
+
+/* TrustZone controller related constants
+ *
+ * Currently only filters 0 and 2 are connected on Base FVP.
+ * Filter 0 : CPU clusters (no access to DRAM by default)
+ * Filter 1 : not connected
+ * Filter 2 : LCDs (access to VRAM allowed by default)
+ * Filter 3 : not connected
+ * Programming unconnected filters will have no effect at the
+ * moment. These filter could, however, be connected in future.
+ * So care should be taken not to configure the unused filters.
+ *
+ * Allow only non-secure access to all DRAM to supported devices.
+ * Give access to the CPUs and Virtio. Some devices
+ * would normally use the default ID so allow that too.
+ */
+#define PLAT_ARM_TZC_FILTERS           REG_ATTR_FILTER_BIT(0)
+
+#define PLAT_ARM_TZC_NS_DEV_ACCESS     (                               \
+               TZC_REGION_ACCESS_RDWR(FVP_NSAID_DEFAULT)       |       \
+               TZC_REGION_ACCESS_RDWR(FVP_NSAID_PCI)           |       \
+               TZC_REGION_ACCESS_RDWR(FVP_NSAID_AP)            |       \
+               TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO)        |       \
+               TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO_OLD))
+
+
+#endif /* __PLATFORM_DEF_H__ */
diff --git a/plat/arm/board/fvp/include/platform_oid.h b/plat/arm/board/fvp/include/platform_oid.h
new file mode 100644 (file)
index 0000000..1e44cf7
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "../../../../../include/plat/arm/board/common/board_arm_oid.h"
+
+/*
+ * Required platform OIDs
+ * (Provided by included header)
+ */
diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk
new file mode 100644 (file)
index 0000000..cba18c7
--- /dev/null
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# Neither the name of ARM nor the names of its contributors may be used
+# to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+
+PLAT_INCLUDES          :=      -Iinclude/plat/arm/board/common                 \
+                               -Iplat/arm/board/fvp/include
+
+
+PLAT_BL_COMMON_SOURCES :=      drivers/arm/pl011/pl011_console.S               \
+                               plat/arm/board/fvp/aarch64/fvp_common.c
+
+BL1_SOURCES            +=      drivers/io/io_semihosting.c                     \
+                               lib/cpus/aarch64/aem_generic.S                  \
+                               lib/cpus/aarch64/cortex_a53.S                   \
+                               lib/cpus/aarch64/cortex_a57.S                   \
+                               lib/semihosting/semihosting.c                   \
+                               lib/semihosting/aarch64/semihosting_call.S      \
+                               plat/arm/board/fvp/aarch64/fvp_helpers.S        \
+                               plat/arm/board/fvp/fvp_bl1_setup.c              \
+                               plat/arm/board/fvp/fvp_io_storage.c
+
+BL2_SOURCES            +=      drivers/io/io_semihosting.c                     \
+                               lib/semihosting/semihosting.c                   \
+                               lib/semihosting/aarch64/semihosting_call.S      \
+                               plat/arm/board/fvp/fvp_bl2_setup.c              \
+                               plat/arm/board/fvp/fvp_io_storage.c             \
+                               plat/arm/board/fvp/fvp_security.c
+
+BL31_SOURCES           +=      lib/cpus/aarch64/aem_generic.S                  \
+                               lib/cpus/aarch64/cortex_a53.S                   \
+                               lib/cpus/aarch64/cortex_a57.S                   \
+                               plat/arm/board/fvp/fvp_bl31_setup.c             \
+                               plat/arm/board/fvp/fvp_pm.c                     \
+                               plat/arm/board/fvp/fvp_security.c               \
+                               plat/arm/board/fvp/fvp_topology.c               \
+                               plat/arm/board/fvp/aarch64/fvp_helpers.S        \
+                               plat/arm/board/fvp/drivers/pwrc/fvp_pwrc.c
+
+ifneq (${TRUSTED_BOARD_BOOT},0)
+  BL1_SOURCES          +=      plat/arm/board/common/board_arm_trusted_boot.c
+  BL2_SOURCES          +=      plat/arm/board/common/board_arm_trusted_boot.c
+endif
+
+
+include plat/arm/common/arm_common.mk
diff --git a/plat/arm/board/fvp/tsp/fvp_tsp_setup.c b/plat/arm/board/fvp/tsp/fvp_tsp_setup.c
new file mode 100644 (file)
index 0000000..64246db
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <plat_arm.h>
+#include "../fvp_private.h"
+
+void tsp_early_platform_setup(void)
+{
+       arm_tsp_early_platform_setup();
+
+       /* Initialize the platform config for future decision making */
+       fvp_config_setup();
+}
diff --git a/plat/arm/board/fvp/tsp/tsp-fvp.mk b/plat/arm/board/fvp/tsp/tsp-fvp.mk
new file mode 100644 (file)
index 0000000..8773ee0
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# Neither the name of ARM nor the names of its contributors may be used
+# to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+# TSP source files specific to FVP platform
+BL32_SOURCES           +=      plat/arm/board/fvp/tsp/fvp_tsp_setup.c
+
+include plat/arm/common/tsp/arm_tsp.mk
diff --git a/plat/fvp/aarch64/fvp_common.c b/plat/fvp/aarch64/fvp_common.c
deleted file mode 100644 (file)
index a876313..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arm_config.h>
-#include <arm_def.h>
-#include <arm_gic.h>
-#include <cci.h>
-#include <debug.h>
-#include <mmio.h>
-#include <plat_arm.h>
-#include <v2m_def.h>
-#include "../fvp_def.h"
-
-/*******************************************************************************
- * arm_config holds the characteristics of the differences between the three FVP
- * platforms (Base, A53_A57 & Foundation). It will be populated during cold boot
- * at each boot stage by the primary before enabling the MMU (to allow cci
- * configuration) & used thereafter. Each BL will have its own copy to allow
- * independent operation.
- ******************************************************************************/
-arm_config_t arm_config;
-
-#define MAP_DEVICE0    MAP_REGION_FLAT(DEVICE0_BASE,                   \
-                                       DEVICE0_SIZE,                   \
-                                       MT_DEVICE | MT_RW | MT_SECURE)
-
-#define MAP_DEVICE1    MAP_REGION_FLAT(DEVICE1_BASE,                   \
-                                       DEVICE1_SIZE,                   \
-                                       MT_DEVICE | MT_RW | MT_SECURE)
-
-/*
- * Table of regions for various BL stages to map using the MMU.
- * This doesn't include TZRAM as the 'mem_layout' argument passed to
- * arm_configure_mmu_elx() will give the available subset of that,
- */
-#if IMAGE_BL1
-const mmap_region_t plat_arm_mmap[] = {
-       ARM_MAP_SHARED_RAM,
-       V2M_MAP_FLASH0,
-       V2M_MAP_IOFPGA,
-       MAP_DEVICE0,
-       MAP_DEVICE1,
-       {0}
-};
-#endif
-#if IMAGE_BL2
-const mmap_region_t plat_arm_mmap[] = {
-       ARM_MAP_SHARED_RAM,
-       V2M_MAP_FLASH0,
-       V2M_MAP_IOFPGA,
-       MAP_DEVICE0,
-       MAP_DEVICE1,
-       ARM_MAP_NS_DRAM1,
-       ARM_MAP_TSP_SEC_MEM,
-       {0}
-};
-#endif
-#if IMAGE_BL31
-const mmap_region_t plat_arm_mmap[] = {
-       ARM_MAP_SHARED_RAM,
-       V2M_MAP_IOFPGA,
-       MAP_DEVICE0,
-       MAP_DEVICE1,
-       {0}
-};
-#endif
-#if IMAGE_BL32
-const mmap_region_t plat_arm_mmap[] = {
-       V2M_MAP_IOFPGA,
-       MAP_DEVICE0,
-       MAP_DEVICE1,
-       {0}
-};
-#endif
-
-ARM_CASSERT_MMAP
-
-
-#if IMAGE_BL31 || IMAGE_BL32
-/* Array of secure interrupts to be configured by the gic driver */
-const unsigned int irq_sec_array[] = {
-       IRQ_TZ_WDOG,
-       ARM_IRQ_SEC_PHY_TIMER,
-       ARM_IRQ_SEC_SGI_0,
-       ARM_IRQ_SEC_SGI_1,
-       ARM_IRQ_SEC_SGI_2,
-       ARM_IRQ_SEC_SGI_3,
-       ARM_IRQ_SEC_SGI_4,
-       ARM_IRQ_SEC_SGI_5,
-       ARM_IRQ_SEC_SGI_6,
-       ARM_IRQ_SEC_SGI_7
-};
-
-void plat_arm_gic_init(void)
-{
-       arm_gic_init(arm_config.gicc_base,
-               arm_config.gicd_base,
-               BASE_GICR_BASE,
-               irq_sec_array,
-               ARRAY_SIZE(irq_sec_array));
-}
-
-#endif
-
-/*******************************************************************************
- * A single boot loader stack is expected to work on both the Foundation FVP
- * models and the two flavours of the Base FVP models (AEMv8 & Cortex). The
- * SYS_ID register provides a mechanism for detecting the differences between
- * these platforms. This information is stored in a per-BL array to allow the
- * code to take the correct path.Per BL platform configuration.
- ******************************************************************************/
-void fvp_config_setup(void)
-{
-       unsigned int rev, hbi, bld, arch, sys_id;
-
-       sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
-       rev = (sys_id >> V2M_SYS_ID_REV_SHIFT) & V2M_SYS_ID_REV_MASK;
-       hbi = (sys_id >> V2M_SYS_ID_HBI_SHIFT) & V2M_SYS_ID_HBI_MASK;
-       bld = (sys_id >> V2M_SYS_ID_BLD_SHIFT) & V2M_SYS_ID_BLD_MASK;
-       arch = (sys_id >> V2M_SYS_ID_ARCH_SHIFT) & V2M_SYS_ID_ARCH_MASK;
-
-       if (arch != ARCH_MODEL) {
-               ERROR("This firmware is for FVP models\n");
-               panic();
-       }
-
-       /*
-        * The build field in the SYS_ID tells which variant of the GIC
-        * memory is implemented by the model.
-        */
-       switch (bld) {
-       case BLD_GIC_VE_MMAP:
-               arm_config.gicd_base = VE_GICD_BASE;
-               arm_config.gicc_base = VE_GICC_BASE;
-               arm_config.gich_base = VE_GICH_BASE;
-               arm_config.gicv_base = VE_GICV_BASE;
-               break;
-       case BLD_GIC_A53A57_MMAP:
-               arm_config.gicd_base = BASE_GICD_BASE;
-               arm_config.gicc_base = BASE_GICC_BASE;
-               arm_config.gich_base = BASE_GICH_BASE;
-               arm_config.gicv_base = BASE_GICV_BASE;
-               break;
-       default:
-               ERROR("Unsupported board build %x\n", bld);
-               panic();
-       }
-
-       /*
-        * The hbi field in the SYS_ID is 0x020 for the Base FVP & 0x010
-        * for the Foundation FVP.
-        */
-       switch (hbi) {
-       case HBI_FOUNDATION_FVP:
-               arm_config.max_aff0 = 4;
-               arm_config.max_aff1 = 1;
-               arm_config.flags = 0;
-
-               /*
-                * Check for supported revisions of Foundation FVP
-                * Allow future revisions to run but emit warning diagnostic
-                */
-               switch (rev) {
-               case REV_FOUNDATION_FVP_V2_0:
-               case REV_FOUNDATION_FVP_V2_1:
-               case REV_FOUNDATION_FVP_v9_1:
-                       break;
-               default:
-                       WARN("Unrecognized Foundation FVP revision %x\n", rev);
-                       break;
-               }
-               break;
-       case HBI_BASE_FVP:
-               arm_config.max_aff0 = 4;
-               arm_config.max_aff1 = 2;
-               arm_config.flags |= ARM_CONFIG_BASE_MMAP |
-                       ARM_CONFIG_HAS_CCI | ARM_CONFIG_HAS_TZC;
-
-               /*
-                * Check for supported revisions
-                * Allow future revisions to run but emit warning diagnostic
-                */
-               switch (rev) {
-               case REV_BASE_FVP_V0:
-                       break;
-               default:
-                       WARN("Unrecognized Base FVP revision %x\n", rev);
-                       break;
-               }
-               break;
-       default:
-               ERROR("Unsupported board HBI number 0x%x\n", hbi);
-               panic();
-       }
-}
-
-
-void fvp_cci_init(void)
-{
-       /*
-        * Initialize CCI-400 driver
-        */
-       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
-               arm_cci_init();
-}
-
-void fvp_cci_enable(void)
-{
-       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
-               cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
-}
-
-void fvp_cci_disable(void)
-{
-       if (arm_config.flags & ARM_CONFIG_HAS_CCI)
-               cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
-}
diff --git a/plat/fvp/aarch64/fvp_helpers.S b/plat/fvp/aarch64/fvp_helpers.S
deleted file mode 100644 (file)
index dd56687..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arch.h>
-#include <asm_macros.S>
-#include <gic_v2.h>
-#include <platform_def.h>
-#include <v2m_def.h>
-#include "../drivers/pwrc/fvp_pwrc.h"
-#include "../fvp_def.h"
-
-       .globl  plat_secondary_cold_boot_setup
-       .globl  platform_get_entrypoint
-       .globl  platform_mem_init
-       .globl  platform_is_primary_cpu
-
-       .macro  fvp_choose_gicmmap  param1, param2, x_tmp, w_tmp, res
-       ldr     \x_tmp, =V2M_SYSREGS_BASE + V2M_SYS_ID
-       ldr     \w_tmp, [\x_tmp]
-       ubfx    \w_tmp, \w_tmp, #V2M_SYS_ID_BLD_SHIFT, #V2M_SYS_ID_BLD_LENGTH
-       cmp     \w_tmp, #BLD_GIC_VE_MMAP
-       csel    \res, \param1, \param2, eq
-       .endm
-
-       /* -----------------------------------------------------
-        * void plat_secondary_cold_boot_setup (void);
-        *
-        * This function performs any platform specific actions
-        * needed for a secondary cpu after a cold reset e.g
-        * mark the cpu's presence, mechanism to place it in a
-        * holding pen etc.
-        * TODO: Should we read the PSYS register to make sure
-        * that the request has gone through.
-        * -----------------------------------------------------
-        */
-func plat_secondary_cold_boot_setup
-       /* ---------------------------------------------
-        * Power down this cpu.
-        * TODO: Do we need to worry about powering the
-        * cluster down as well here. That will need
-        * locks which we won't have unless an elf-
-        * loader zeroes out the zi section.
-        * ---------------------------------------------
-        */
-       mrs     x0, mpidr_el1
-       ldr     x1, =PWRC_BASE
-       str     w0, [x1, #PPOFFR_OFF]
-
-       /* ---------------------------------------------
-        * Deactivate the gic cpu interface as well
-        * ---------------------------------------------
-        */
-       ldr     x0, =VE_GICC_BASE
-       ldr     x1, =BASE_GICC_BASE
-       fvp_choose_gicmmap      x0, x1, x2, w2, x1
-       mov     w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1)
-       orr     w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0)
-       str     w0, [x1, #GICC_CTLR]
-
-       /* ---------------------------------------------
-        * There is no sane reason to come out of this
-        * wfi so panic if we do. This cpu will be pow-
-        * ered on and reset by the cpu_on pm api
-        * ---------------------------------------------
-        */
-       dsb     sy
-       wfi
-cb_panic:
-       b       cb_panic
-endfunc plat_secondary_cold_boot_setup
-
-
-       /* -----------------------------------------------------
-        * void platform_get_entrypoint (unsigned int mpid);
-        *
-        * Main job of this routine is to distinguish between
-        * a cold and warm boot.
-        * On a cold boot the secondaries first wait for the
-        * platform to be initialized after which they are
-        * hotplugged in. The primary proceeds to perform the
-        * platform initialization.
-        * On a warm boot, each cpu jumps to the address in its
-        * mailbox.
-        *
-        * TODO: Not a good idea to save lr in a temp reg
-        * TODO: PSYSR is a common register and should be
-        *      accessed using locks. Since its not possible
-        *      to use locks immediately after a cold reset
-        *      we are relying on the fact that after a cold
-        *      reset all cpus will read the same WK field
-        * -----------------------------------------------------
-        */
-func platform_get_entrypoint
-       mov     x9, x30 // lr
-       mov     x2, x0
-       ldr     x1, =PWRC_BASE
-       str     w2, [x1, #PSYSR_OFF]
-       ldr     w2, [x1, #PSYSR_OFF]
-       ubfx    w2, w2, #PSYSR_WK_SHIFT, #PSYSR_WK_MASK
-       cmp     w2, #WKUP_PPONR
-       beq     warm_reset
-       cmp     w2, #WKUP_GICREQ
-       beq     warm_reset
-       mov     x0, #0
-       b       exit
-warm_reset:
-       /* ---------------------------------------------
-        * A per-cpu mailbox is maintained in the tru-
-        * sted DRAM. Its flushed out of the caches
-        * after every update using normal memory so
-        * its safe to read it here with SO attributes
-        * ---------------------------------------------
-        */
-       ldr     x10, =MBOX_BASE
-       bl      platform_get_core_pos
-       lsl     x0, x0, #ARM_CACHE_WRITEBACK_SHIFT
-       ldr     x0, [x10, x0]
-       cbz     x0, _panic
-exit:
-       ret     x9
-_panic:        b       _panic
-endfunc platform_get_entrypoint
-
-
-       /* -----------------------------------------------------
-        * void platform_mem_init (void);
-        *
-        * Zero out the mailbox registers in the shared memory.
-        * The mmu is turned off right now and only the primary can
-        * ever execute this code. Secondaries will read the
-        * mailboxes using SO accesses. In short, BL31 will
-        * update the mailboxes after mapping the tzdram as
-        * normal memory. It will flush its copy after update.
-        * BL1 will always read the mailboxes with the MMU off
-        * -----------------------------------------------------
-        */
-func platform_mem_init
-       ldr     x0, =MBOX_BASE
-       mov     w1, #PLATFORM_CORE_COUNT
-loop:
-       str     xzr, [x0], #CACHE_WRITEBACK_GRANULE
-       subs    w1, w1, #1
-       b.gt    loop
-       ret
-endfunc platform_mem_init
-
-
-func platform_is_primary_cpu
-       and     x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
-       cmp     x0, #FVP_PRIMARY_CPU
-       cset    x0, eq
-       ret
-endfunc platform_is_primary_cpu
diff --git a/plat/fvp/bl1_fvp_setup.c b/plat/fvp/bl1_fvp_setup.c
deleted file mode 100644 (file)
index 33712d1..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <plat_arm.h>
-#include "fvp_private.h"
-
-
-/*******************************************************************************
- * Perform any BL1 specific platform actions.
- ******************************************************************************/
-void bl1_early_platform_setup(void)
-{
-       arm_bl1_early_platform_setup();
-
-       /* Initialize the platform config for future decision making */
-       fvp_config_setup();
-
-       /*
-        * Initialize CCI for this cluster during cold boot.
-        * No need for locks as no other CPU is active.
-        */
-       fvp_cci_init();
-       /*
-        * Enable CCI coherency for the primary CPU's cluster.
-        */
-       fvp_cci_enable();
-}
diff --git a/plat/fvp/bl2_fvp_setup.c b/plat/fvp/bl2_fvp_setup.c
deleted file mode 100644 (file)
index a08f42c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <plat_arm.h>
-#include "fvp_private.h"
-
-
-void bl2_early_platform_setup(meminfo_t *mem_layout)
-{
-       arm_bl2_early_platform_setup(mem_layout);
-
-       /* Initialize the platform config for future decision making */
-       fvp_config_setup();
-}
diff --git a/plat/fvp/bl31_fvp_setup.c b/plat/fvp/bl31_fvp_setup.c
deleted file mode 100644 (file)
index b50ae55..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <plat_arm.h>
-#include "fvp_private.h"
-
-
-void bl31_early_platform_setup(bl31_params_t *from_bl2,
-                               void *plat_params_from_bl2)
-{
-       arm_bl31_early_platform_setup(from_bl2, plat_params_from_bl2);
-
-       /* Initialize the platform config for future decision making */
-       fvp_config_setup();
-
-       /*
-        * Initialize CCI for this cluster during cold boot.
-        * No need for locks as no other CPU is active.
-        */
-       fvp_cci_init();
-#if RESET_TO_BL31
-       /*
-        * Enable CCI coherency for the primary CPU's cluster
-        * (if earlier BL has not already done so).
-        * FVP PSCI code will enable coherency for other clusters.
-        */
-       fvp_cci_enable();
-
-#endif /* RESET_TO_BL31 */
-}
diff --git a/plat/fvp/drivers/pwrc/fvp_pwrc.c b/plat/fvp/drivers/pwrc/fvp_pwrc.c
deleted file mode 100644 (file)
index e004281..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <bakery_lock.h>
-#include <mmio.h>
-#include <plat_arm.h>
-#include "../../fvp_def.h"
-#include "../../fvp_private.h"
-#include "fvp_pwrc.h"
-
-/*
- * TODO: Someday there will be a generic power controller api. At the moment
- * each platform has its own pwrc so just exporting functions is fine.
- */
-ARM_INSTANTIATE_LOCK
-
-unsigned int fvp_pwrc_get_cpu_wkr(unsigned long mpidr)
-{
-       return PSYSR_WK(fvp_pwrc_read_psysr(mpidr));
-}
-
-unsigned int fvp_pwrc_read_psysr(unsigned long mpidr)
-{
-       unsigned int rc;
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr);
-       rc = mmio_read_32(PWRC_BASE + PSYSR_OFF);
-       arm_lock_release();
-       return rc;
-}
-
-void fvp_pwrc_write_pponr(unsigned long mpidr)
-{
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr);
-       arm_lock_release();
-}
-
-void fvp_pwrc_write_ppoffr(unsigned long mpidr)
-{
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr);
-       arm_lock_release();
-}
-
-void fvp_pwrc_set_wen(unsigned long mpidr)
-{
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PWKUPR_OFF,
-                     (unsigned int) (PWKUPR_WEN | mpidr));
-       arm_lock_release();
-}
-
-void fvp_pwrc_clr_wen(unsigned long mpidr)
-{
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PWKUPR_OFF,
-                     (unsigned int) mpidr);
-       arm_lock_release();
-}
-
-void fvp_pwrc_write_pcoffr(unsigned long mpidr)
-{
-       arm_lock_get();
-       mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr);
-       arm_lock_release();
-}
-
-/* Nothing else to do here apart from initializing the lock */
-void plat_arm_pwrc_setup(void)
-{
-       arm_lock_init();
-}
-
-
-
diff --git a/plat/fvp/drivers/pwrc/fvp_pwrc.h b/plat/fvp/drivers/pwrc/fvp_pwrc.h
deleted file mode 100644 (file)
index 5b755af..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FVP_PWRC_H__
-#define __FVP_PWRC_H__
-
-/* FVP Power controller register offset etc */
-#define PPOFFR_OFF             0x0
-#define PPONR_OFF              0x4
-#define PCOFFR_OFF             0x8
-#define PWKUPR_OFF             0xc
-#define PSYSR_OFF              0x10
-
-#define PWKUPR_WEN             (1ull << 31)
-
-#define PSYSR_AFF_L2           (1 << 31)
-#define PSYSR_AFF_L1           (1 << 30)
-#define PSYSR_AFF_L0           (1 << 29)
-#define PSYSR_WEN              (1 << 28)
-#define PSYSR_PC               (1 << 27)
-#define PSYSR_PP               (1 << 26)
-
-#define PSYSR_WK_SHIFT         24
-#define PSYSR_WK_MASK          0x3
-#define PSYSR_WK(x)            (x >> PSYSR_WK_SHIFT) & PSYSR_WK_MASK
-
-#define WKUP_COLD              0x0
-#define WKUP_RESET             0x1
-#define WKUP_PPONR             0x2
-#define WKUP_GICREQ            0x3
-
-#define PSYSR_INVALID          0xffffffff
-
-#ifndef __ASSEMBLY__
-
-/*******************************************************************************
- * Function & variable prototypes
- ******************************************************************************/
-void fvp_pwrc_write_pcoffr(unsigned long);
-void fvp_pwrc_write_ppoffr(unsigned long);
-void fvp_pwrc_write_pponr(unsigned long);
-void fvp_pwrc_set_wen(unsigned long);
-void fvp_pwrc_clr_wen(unsigned long);
-unsigned int fvp_pwrc_read_psysr(unsigned long);
-unsigned int fvp_pwrc_get_cpu_wkr(unsigned long);
-
-#endif /*__ASSEMBLY__*/
-
-#endif /* __FVP_PWRC_H__ */
diff --git a/plat/fvp/fvp_def.h b/plat/fvp/fvp_def.h
deleted file mode 100644 (file)
index 47723c7..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FVP_DEF_H__
-#define __FVP_DEF_H__
-
-#include <arm_def.h>
-
-
-#define FVP_MAX_CPUS_PER_CLUSTER       4
-
-#define FVP_PRIMARY_CPU                        0x0
-
-/*******************************************************************************
- * FVP memory map related constants
- ******************************************************************************/
-
-#define FLASH1_BASE                    0x0c000000
-#define FLASH1_SIZE                    0x04000000
-
-#define PSRAM_BASE                     0x14000000
-#define PSRAM_SIZE                     0x04000000
-
-#define VRAM_BASE                      0x18000000
-#define VRAM_SIZE                      0x02000000
-
-/* Aggregate of all devices in the first GB */
-#define DEVICE0_BASE                   0x20000000
-#define DEVICE0_SIZE                   0x0c200000
-
-#define DEVICE1_BASE                   0x2f000000
-#define DEVICE1_SIZE                   0x200000
-
-#define NSRAM_BASE                     0x2e000000
-#define NSRAM_SIZE                     0x10000
-
-#define PCIE_EXP_BASE                  0x40000000
-#define TZRNG_BASE                     0x7fe60000
-#define TZNVCTR_BASE                   0x7fe70000
-#define TZROOTKEY_BASE                 0x7fe80000
-
-/* Constants to distinguish FVP type */
-#define HBI_BASE_FVP                   0x020
-#define REV_BASE_FVP_V0                        0x0
-
-#define HBI_FOUNDATION_FVP             0x010
-#define REV_FOUNDATION_FVP_V2_0                0x0
-#define REV_FOUNDATION_FVP_V2_1                0x1
-#define REV_FOUNDATION_FVP_v9_1                0x2
-
-#define BLD_GIC_VE_MMAP                        0x0
-#define BLD_GIC_A53A57_MMAP            0x1
-
-#define ARCH_MODEL                     0x1
-
-/* FVP Power controller base address*/
-#define PWRC_BASE                      0x1c100000
-
-
-/*******************************************************************************
- * GIC-400 & interrupt handling related constants
- ******************************************************************************/
-/* VE compatible GIC memory map */
-#define VE_GICD_BASE                   0x2c001000
-#define VE_GICC_BASE                   0x2c002000
-#define VE_GICH_BASE                   0x2c004000
-#define VE_GICV_BASE                   0x2c006000
-
-/* Base FVP compatible GIC memory map */
-#define BASE_GICD_BASE                 0x2f000000
-#define BASE_GICR_BASE                 0x2f100000
-#define BASE_GICC_BASE                 0x2c000000
-#define BASE_GICH_BASE                 0x2c010000
-#define BASE_GICV_BASE                 0x2c02f000
-
-#define IRQ_TZ_WDOG                    56
-
-
-/*******************************************************************************
- * TrustZone address space controller related constants
- ******************************************************************************/
-
-/* NSAIDs used by devices in TZC filter 0 on FVP */
-#define FVP_NSAID_DEFAULT              0
-#define FVP_NSAID_PCI                  1
-#define FVP_NSAID_VIRTIO               8  /* from FVP v5.6 onwards */
-#define FVP_NSAID_AP                   9  /* Application Processors */
-#define FVP_NSAID_VIRTIO_OLD           15 /* until FVP v5.5 */
-
-/* NSAIDs used by devices in TZC filter 2 on FVP */
-#define FVP_NSAID_HDLCD0               2
-#define FVP_NSAID_CLCD                 7
-
-/*******************************************************************************
- *  Shared Data
- ******************************************************************************/
-
-/* Entrypoint mailboxes */
-#define MBOX_BASE                      ARM_SHARED_RAM_BASE
-#define MBOX_SIZE                      0x200
-
-
-#endif /* __FVP_DEF_H__ */
diff --git a/plat/fvp/fvp_io_storage.c b/plat/fvp/fvp_io_storage.c
deleted file mode 100644 (file)
index 0284c3d..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <assert.h>
-#include <debug.h>
-#include <io_driver.h>
-#include <io_storage.h>
-#include <io_semihosting.h>
-#include <plat_arm.h>
-
-/* IO devices */
-static const io_dev_connector_t *sh_dev_con;
-static uintptr_t sh_dev_handle;
-
-
-static int open_semihosting(const uintptr_t spec)
-{
-       int result = IO_FAIL;
-       uintptr_t local_image_handle;
-
-       /* See if the file exists on semi-hosting.*/
-       result = io_dev_init(sh_dev_handle, (uintptr_t)NULL);
-       if (result == IO_SUCCESS) {
-               result = io_open(sh_dev_handle, spec, &local_image_handle);
-               if (result == IO_SUCCESS) {
-                       VERBOSE("Using Semi-hosting IO\n");
-                       io_close(local_image_handle);
-               }
-       }
-       return result;
-}
-
-void plat_arm_io_setup(void)
-{
-       int io_result;
-
-       arm_io_setup();
-
-       /* Register the additional IO devices on this platform */
-       io_result = register_io_dev_sh(&sh_dev_con);
-       assert(io_result == IO_SUCCESS);
-
-       /* Open connections to devices and cache the handles */
-       io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle);
-       assert(io_result == IO_SUCCESS);
-
-       /* Ignore improbable errors in release builds */
-       (void)io_result;
-}
-
-int plat_arm_get_alt_image_source(
-       const uintptr_t image_spec,
-       uintptr_t *dev_handle)
-{
-       int result = open_semihosting(image_spec);
-       if (result == IO_SUCCESS)
-               *dev_handle = sh_dev_handle;
-
-       return result;
-}
diff --git a/plat/fvp/fvp_pm.c b/plat/fvp/fvp_pm.c
deleted file mode 100644 (file)
index b1431c4..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arch_helpers.h>
-#include <arm_config.h>
-#include <arm_gic.h>
-#include <assert.h>
-#include <debug.h>
-#include <errno.h>
-#include <mmio.h>
-#include <platform.h>
-#include <plat_arm.h>
-#include <psci.h>
-#include <v2m_def.h>
-#include "drivers/pwrc/fvp_pwrc.h"
-#include "fvp_def.h"
-#include "fvp_private.h"
-
-
-typedef volatile struct mailbox {
-       unsigned long value __aligned(CACHE_WRITEBACK_GRANULE);
-} mailbox_t;
-
-/*******************************************************************************
- * Private FVP function to program the mailbox for a cpu before it is released
- * from reset.
- ******************************************************************************/
-static void fvp_program_mailbox(uint64_t mpidr, uint64_t address)
-{
-       uint64_t linear_id;
-       mailbox_t *fvp_mboxes;
-
-       linear_id = platform_get_core_pos(mpidr);
-       fvp_mboxes = (mailbox_t *)MBOX_BASE;
-       fvp_mboxes[linear_id].value = address;
-       flush_dcache_range((unsigned long) &fvp_mboxes[linear_id],
-                          sizeof(unsigned long));
-}
-
-/*******************************************************************************
- * Function which implements the common FVP specific operations to power down a
- * cpu in response to a CPU_OFF or CPU_SUSPEND request.
- ******************************************************************************/
-static void fvp_cpu_pwrdwn_common(void)
-{
-       /* Prevent interrupts from spuriously waking up this cpu */
-       arm_gic_cpuif_deactivate();
-
-       /* Program the power controller to power off this cpu. */
-       fvp_pwrc_write_ppoffr(read_mpidr_el1());
-}
-
-/*******************************************************************************
- * Function which implements the common FVP specific operations to power down a
- * cluster in response to a CPU_OFF or CPU_SUSPEND request.
- ******************************************************************************/
-static void fvp_cluster_pwrdwn_common(void)
-{
-       uint64_t mpidr = read_mpidr_el1();
-
-       /* Disable coherency if this cluster is to be turned off */
-       fvp_cci_disable();
-
-       /* Program the power controller to turn the cluster off */
-       fvp_pwrc_write_pcoffr(mpidr);
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance is about to enter standby.
- ******************************************************************************/
-void fvp_affinst_standby(unsigned int power_state)
-{
-       /*
-        * Enter standby state
-        * dsb is good practice before using wfi to enter low power states
-        */
-       dsb();
-       wfi();
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance is about to be turned on. The
- * level and mpidr determine the affinity instance.
- ******************************************************************************/
-int fvp_affinst_on(unsigned long mpidr,
-                  unsigned long sec_entrypoint,
-                  unsigned int afflvl,
-                  unsigned int state)
-{
-       int rc = PSCI_E_SUCCESS;
-       unsigned int psysr;
-
-       /*
-        * It's possible to turn on only affinity level 0 i.e. a cpu
-        * on the FVP. Ignore any other affinity level.
-        */
-       if (afflvl != MPIDR_AFFLVL0)
-               return rc;
-
-       /*
-        * Ensure that we do not cancel an inflight power off request
-        * for the target cpu. That would leave it in a zombie wfi.
-        * Wait for it to power off, program the jump address for the
-        * target cpu and then program the power controller to turn
-        * that cpu on
-        */
-       do {
-               psysr = fvp_pwrc_read_psysr(mpidr);
-       } while (psysr & PSYSR_AFF_L0);
-
-       fvp_program_mailbox(mpidr, sec_entrypoint);
-       fvp_pwrc_write_pponr(mpidr);
-
-       return rc;
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance is about to be turned off. The
- * level and mpidr determine the affinity instance. The 'state' arg. allows the
- * platform to decide whether the cluster is being turned off and take apt
- * actions.
- *
- * CAUTION: There is no guarantee that caches will remain turned on across calls
- * to this function as each affinity level is dealt with. So do not write & read
- * global variables across calls. It will be wise to do flush a write to the
- * global to prevent unpredictable results.
- ******************************************************************************/
-void fvp_affinst_off(unsigned int afflvl,
-                   unsigned int state)
-{
-       /* Determine if any platform actions need to be executed */
-       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
-               return;
-
-       /*
-        * If execution reaches this stage then this affinity level will be
-        * suspended. Perform at least the cpu specific actions followed the
-        * cluster specific operations if applicable.
-        */
-       fvp_cpu_pwrdwn_common();
-
-       if (afflvl != MPIDR_AFFLVL0)
-               fvp_cluster_pwrdwn_common();
-
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance is about to be suspended. The
- * level and mpidr determine the affinity instance. The 'state' arg. allows the
- * platform to decide whether the cluster is being turned off and take apt
- * actions.
- *
- * CAUTION: There is no guarantee that caches will remain turned on across calls
- * to this function as each affinity level is dealt with. So do not write & read
- * global variables across calls. It will be wise to do flush a write to the
- * global to prevent unpredictable results.
- ******************************************************************************/
-void fvp_affinst_suspend(unsigned long sec_entrypoint,
-                       unsigned int afflvl,
-                       unsigned int state)
-{
-       unsigned long mpidr;
-
-       /* Determine if any platform actions need to be executed. */
-       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
-               return;
-
-       /* Get the mpidr for this cpu */
-       mpidr = read_mpidr_el1();
-
-       /* Program the jump address for the this cpu */
-       fvp_program_mailbox(mpidr, sec_entrypoint);
-
-       /* Program the power controller to enable wakeup interrupts. */
-       fvp_pwrc_set_wen(mpidr);
-
-       /* Perform the common cpu specific operations */
-       fvp_cpu_pwrdwn_common();
-
-       /* Perform the common cluster specific operations */
-       if (afflvl != MPIDR_AFFLVL0)
-               fvp_cluster_pwrdwn_common();
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance has just been powered on after
- * being turned off earlier. The level and mpidr determine the affinity
- * instance. The 'state' arg. allows the platform to decide whether the cluster
- * was turned off prior to wakeup and do what's necessary to setup it up
- * correctly.
- ******************************************************************************/
-void fvp_affinst_on_finish(unsigned int afflvl,
-                         unsigned int state)
-{
-       unsigned long mpidr;
-
-       /* Determine if any platform actions need to be executed. */
-       if (arm_do_affinst_actions(afflvl, state) == -EAGAIN)
-               return;
-
-       /* Get the mpidr for this cpu */
-       mpidr = read_mpidr_el1();
-
-       /* Perform the common cluster specific operations */
-       if (afflvl != MPIDR_AFFLVL0) {
-               /*
-                * This CPU might have woken up whilst the cluster was
-                * attempting to power down. In this case the FVP power
-                * controller will have a pending cluster power off request
-                * which needs to be cleared by writing to the PPONR register.
-                * This prevents the power controller from interpreting a
-                * subsequent entry of this cpu into a simple wfi as a power
-                * down request.
-                */
-               fvp_pwrc_write_pponr(mpidr);
-
-               /* Enable coherency if this cluster was off */
-               fvp_cci_enable();
-       }
-
-       /*
-        * Clear PWKUPR.WEN bit to ensure interrupts do not interfere
-        * with a cpu power down unless the bit is set again
-        */
-       fvp_pwrc_clr_wen(mpidr);
-
-       /* Zero the jump address in the mailbox for this cpu */
-       fvp_program_mailbox(mpidr, 0);
-
-       /* Enable the gic cpu interface */
-       arm_gic_cpuif_setup();
-
-       /* TODO: This setup is needed only after a cold boot */
-       arm_gic_pcpu_distif_setup();
-}
-
-/*******************************************************************************
- * FVP handler called when an affinity instance has just been powered on after
- * having been suspended earlier. The level and mpidr determine the affinity
- * instance.
- * TODO: At the moment we reuse the on finisher and reinitialize the secure
- * context. Need to implement a separate suspend finisher.
- ******************************************************************************/
-void fvp_affinst_suspend_finish(unsigned int afflvl,
-                              unsigned int state)
-{
-       fvp_affinst_on_finish(afflvl, state);
-}
-
-/*******************************************************************************
- * FVP handlers to shutdown/reboot the system
- ******************************************************************************/
-static void __dead2 fvp_system_off(void)
-{
-       /* Write the System Configuration Control Register */
-       mmio_write_32(V2M_SYSREGS_BASE + V2M_SYS_CFGCTRL,
-               V2M_CFGCTRL_START |
-               V2M_CFGCTRL_RW |
-               V2M_CFGCTRL_FUNC(V2M_FUNC_SHUTDOWN));
-       wfi();
-       ERROR("FVP System Off: operation not handled.\n");
-       panic();
-}
-
-static void __dead2 fvp_system_reset(void)
-{
-       /* Write the System Configuration Control Register */
-       mmio_write_32(V2M_SYSREGS_BASE + V2M_SYS_CFGCTRL,
-               V2M_CFGCTRL_START |
-               V2M_CFGCTRL_RW |
-               V2M_CFGCTRL_FUNC(V2M_FUNC_REBOOT));
-       wfi();
-       ERROR("FVP System Reset: operation not handled.\n");
-       panic();
-}
-
-/*******************************************************************************
- * Export the platform handlers to enable psci to invoke them
- ******************************************************************************/
-static const plat_pm_ops_t fvp_plat_pm_ops = {
-       .affinst_standby = fvp_affinst_standby,
-       .affinst_on = fvp_affinst_on,
-       .affinst_off = fvp_affinst_off,
-       .affinst_suspend = fvp_affinst_suspend,
-       .affinst_on_finish = fvp_affinst_on_finish,
-       .affinst_suspend_finish = fvp_affinst_suspend_finish,
-       .system_off = fvp_system_off,
-       .system_reset = fvp_system_reset,
-       .validate_power_state = arm_validate_power_state
-};
-
-/*******************************************************************************
- * Export the platform specific power ops & initialize the fvp power controller
- ******************************************************************************/
-int platform_setup_pm(const plat_pm_ops_t **plat_ops)
-{
-       *plat_ops = &fvp_plat_pm_ops;
-       return 0;
-}
diff --git a/plat/fvp/fvp_private.h b/plat/fvp/fvp_private.h
deleted file mode 100644 (file)
index e88a45e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FVP_PRIVATE_H__
-#define __FVP_PRIVATE_H__
-
-#include <plat_arm.h>
-
-/*******************************************************************************
- * Function and variable prototypes
- ******************************************************************************/
-
-void fvp_config_setup(void);
-
-void fvp_cci_init(void);
-void fvp_cci_enable(void);
-void fvp_cci_disable(void);
-
-
-#endif /* __FVP_PRIVATE_H__ */
diff --git a/plat/fvp/fvp_security.c b/plat/fvp/fvp_security.c
deleted file mode 100644 (file)
index 0cf8450..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arm_config.h>
-#include <plat_arm.h>
-
-/*
- * We assume that all security programming is done by the primary core.
- */
-void plat_arm_security_setup(void)
-{
-       /*
-        * The Base FVP has a TrustZone address space controller, the Foundation
-        * FVP does not. Trying to program the device on the foundation FVP will
-        * cause an abort.
-        *
-        * If the platform had additional peripheral specific security
-        * configurations, those would be configured here.
-        */
-
-       if (get_arm_config()->flags & ARM_CONFIG_HAS_TZC)
-               arm_tzc_setup();
-}
diff --git a/plat/fvp/fvp_topology.c b/plat/fvp/fvp_topology.c
deleted file mode 100644 (file)
index 168864a..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arch.h>
-#include <assert.h>
-#include <platform_def.h>
-/* TODO: Reusing psci error codes & state information. Get our own! */
-#include <psci.h>
-#include "drivers/pwrc/fvp_pwrc.h"
-#include "fvp_def.h"
-
-/* We treat '255' as an invalid affinity instance */
-#define AFFINST_INVAL  0xff
-
-/*******************************************************************************
- * We support 3 flavours of the FVP: Foundation, Base AEM & Base Cortex. Each
- * flavour has a different topology. The common bit is that there can be a max.
- * of 2 clusters (affinity 1) and 4 cpus (affinity 0) per cluster. So we define
- * a tree like data structure which caters to these maximum bounds. It simply
- * marks the absent affinity level instances as PSCI_AFF_ABSENT e.g. there is no
- * cluster 1 on the Foundation FVP. The 'data' field is currently unused.
- ******************************************************************************/
-typedef struct affinity_info {
-       unsigned char sibling;
-       unsigned char child;
-       unsigned char state;
-       unsigned int data;
-} affinity_info_t;
-
-/*******************************************************************************
- * The following two data structures store the topology tree for the fvp. There
- * is a separate array for each affinity level i.e. cpus and clusters. The child
- * and sibling references allow traversal inside and in between the two arrays.
- ******************************************************************************/
-static affinity_info_t fvp_aff1_topology_map[ARM_CLUSTER_COUNT];
-static affinity_info_t fvp_aff0_topology_map[PLATFORM_CORE_COUNT];
-
-/* Simple global variable to safeguard us from stupidity */
-static unsigned int topology_setup_done;
-
-/*******************************************************************************
- * This function implements a part of the critical interface between the psci
- * generic layer and the platform to allow the former to detect the platform
- * topology. psci queries the platform to determine how many affinity instances
- * are present at a particular level for a given mpidr e.g. consider a dual
- * cluster platform where each cluster has 4 cpus. A call to this function with
- * (0, 0x100) will return the number of cpus implemented under cluster 1 i.e. 4.
- * Similarly a call with (1, 0x100) will return 2 i.e. the number of clusters.
- * This is 'cause we are effectively asking how many affinity level 1 instances
- * are implemented under affinity level 2 instance 0.
- ******************************************************************************/
-unsigned int plat_get_aff_count(unsigned int aff_lvl,
-                               unsigned long mpidr)
-{
-       unsigned int aff_count = 1, ctr;
-       unsigned char parent_aff_id;
-
-       assert(topology_setup_done == 1);
-
-       switch (aff_lvl) {
-       case 3:
-       case 2:
-               /*
-                * Assert if the parent affinity instance is not 0.
-                * This also takes care of level 3 in an obfuscated way
-                */
-               parent_aff_id = (mpidr >> MPIDR_AFF3_SHIFT) & MPIDR_AFFLVL_MASK;
-               assert(parent_aff_id == 0);
-
-               /*
-                * Report that we implement a single instance of
-                * affinity levels 2 & 3 which are AFF_ABSENT
-                */
-               break;
-       case 1:
-               /* Assert if the parent affinity instance is not 0. */
-               parent_aff_id = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
-               assert(parent_aff_id == 0);
-
-               /* Fetch the starting index in the aff1 array */
-               for (ctr = 0;
-                    fvp_aff1_topology_map[ctr].sibling != AFFINST_INVAL;
-                    ctr = fvp_aff1_topology_map[ctr].sibling) {
-                       aff_count++;
-               }
-
-               break;
-       case 0:
-               /* Assert if the cluster id is anything apart from 0 or 1 */
-               parent_aff_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
-               assert(parent_aff_id < ARM_CLUSTER_COUNT);
-
-               /* Fetch the starting index in the aff0 array */
-               for (ctr = fvp_aff1_topology_map[parent_aff_id].child;
-                    fvp_aff0_topology_map[ctr].sibling != AFFINST_INVAL;
-                    ctr = fvp_aff0_topology_map[ctr].sibling) {
-                       aff_count++;
-               }
-
-               break;
-       default:
-               assert(0);
-       }
-
-       return aff_count;
-}
-
-/*******************************************************************************
- * This function implements a part of the critical interface between the psci
- * generic layer and the platform to allow the former to detect the state of a
- * affinity instance in the platform topology. psci queries the platform to
- * determine whether an affinity instance is present or absent. This caters for
- * topologies where an intermediate affinity level instance is missing e.g.
- * consider a platform which implements a single cluster with 4 cpus and there
- * is another cpu sitting directly on the interconnect along with the cluster.
- * The mpidrs of the cluster would range from 0x0-0x3. The mpidr of the single
- * cpu would be 0x100 to highlight that it does not belong to cluster 0. Cluster
- * 1 is however missing but needs to be accounted to reach this single cpu in
- * the topology tree. Hence it will be marked as PSCI_AFF_ABSENT. This is not
- * applicable to the FVP but depicted as an example.
- ******************************************************************************/
-unsigned int plat_get_aff_state(unsigned int aff_lvl,
-                               unsigned long mpidr)
-{
-       unsigned int aff_state = PSCI_AFF_ABSENT, idx;
-       idx = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
-
-       assert(topology_setup_done == 1);
-
-       switch (aff_lvl) {
-       case 3:
-       case 2:
-               /* Report affinity levels 2 & 3 as absent */
-               break;
-       case 1:
-               aff_state = fvp_aff1_topology_map[idx].state;
-               break;
-       case 0:
-               /*
-                * First get start index of the aff0 in its array & then add
-                * to it the affinity id that we want the state of
-                */
-               idx = fvp_aff1_topology_map[idx].child;
-               idx += (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
-               aff_state = fvp_aff0_topology_map[idx].state;
-               break;
-       default:
-               assert(0);
-       }
-
-       return aff_state;
-}
-
-/*******************************************************************************
- * This function populates the FVP specific topology information depending upon
- * the FVP flavour its running on. We construct all the mpidrs we can handle
- * and rely on the PWRC.PSYSR to flag absent cpus when their status is queried.
- ******************************************************************************/
-int plat_arm_topology_setup(void)
-{
-       unsigned char aff0, aff1, aff_state, aff0_offset = 0;
-       unsigned long mpidr;
-
-       topology_setup_done = 0;
-
-       for (aff1 = 0; aff1 < ARM_CLUSTER_COUNT; aff1++) {
-
-               fvp_aff1_topology_map[aff1].child = aff0_offset;
-               fvp_aff1_topology_map[aff1].sibling = aff1 + 1;
-
-               for (aff0 = 0; aff0 < FVP_MAX_CPUS_PER_CLUSTER; aff0++) {
-
-                       mpidr = aff1 << MPIDR_AFF1_SHIFT;
-                       mpidr |= aff0 << MPIDR_AFF0_SHIFT;
-
-                       if (fvp_pwrc_read_psysr(mpidr) != PSYSR_INVALID) {
-                               /*
-                                * Presence of even a single aff0 indicates
-                                * presence of parent aff1 on the FVP.
-                                */
-                               aff_state = PSCI_AFF_PRESENT;
-                               fvp_aff1_topology_map[aff1].state =
-                                       PSCI_AFF_PRESENT;
-                       } else {
-                               aff_state = PSCI_AFF_ABSENT;
-                       }
-
-                       fvp_aff0_topology_map[aff0_offset].child = AFFINST_INVAL;
-                       fvp_aff0_topology_map[aff0_offset].state = aff_state;
-                       fvp_aff0_topology_map[aff0_offset].sibling =
-                               aff0_offset + 1;
-
-                       /* Increment the absolute number of aff0s traversed */
-                       aff0_offset++;
-               }
-
-               /* Tie-off the last aff0 sibling to -1 to avoid overflow */
-               fvp_aff0_topology_map[aff0_offset - 1].sibling = AFFINST_INVAL;
-       }
-
-       /* Tie-off the last aff1 sibling to AFFINST_INVAL to avoid overflow */
-       fvp_aff1_topology_map[aff1 - 1].sibling = AFFINST_INVAL;
-
-       topology_setup_done = 1;
-       return 0;
-}
diff --git a/plat/fvp/include/plat_macros.S b/plat/fvp/include/plat_macros.S
deleted file mode 100644 (file)
index 2feffbe..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __PLAT_MACROS_S__
-#define __PLAT_MACROS_S__
-
-#include <arm_macros.S>
-#include <v2m_def.h>
-#include "../fvp_def.h"
-
-       /* ---------------------------------------------
-        * The below required platform porting macro
-        * prints out relevant GIC registers whenever an
-        * unhandled exception is taken in BL3-1.
-        * Clobbers: x0 - x10, x16, x17, sp
-        * ---------------------------------------------
-        */
-       .macro plat_print_gic_regs
-       /*
-        * Detect if we're using the base memory map or
-        * the legacy VE memory map
-        */
-       mov_imm x0, (V2M_SYSREGS_BASE + V2M_SYS_ID)
-       ldr     w16, [x0]
-       /* Extract BLD (12th - 15th bits) from the SYS_ID */
-       ubfx    x16, x16, #V2M_SYS_ID_BLD_SHIFT, #4
-       /* Check if VE mmap */
-       cmp     w16, #BLD_GIC_VE_MMAP
-       b.eq    use_ve_mmap
-       /* Check if Cortex-A53/A57 mmap */
-       cmp     w16, #BLD_GIC_A53A57_MMAP
-       b.ne    exit_print_gic_regs
-       mov_imm x17, BASE_GICC_BASE
-       mov_imm x16, BASE_GICD_BASE
-       b       print_gicc_regs
-use_ve_mmap:
-       mov_imm x17, VE_GICC_BASE
-       mov_imm x16, VE_GICD_BASE
-print_gicc_regs:
-       arm_print_gic_regs
-       .endm
-
-#endif /* __PLAT_MACROS_S__ */
diff --git a/plat/fvp/include/platform_def.h b/plat/fvp/include/platform_def.h
deleted file mode 100644 (file)
index c2a7d6a..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __PLATFORM_DEF_H__
-#define __PLATFORM_DEF_H__
-
-#include <arm_def.h>
-#include <board_arm_def.h>
-#include <common_def.h>
-#include <tzc400.h>
-#include <v2m_def.h>
-#include "../fvp_def.h"
-
-
-/*
- * Most platform porting definitions provided by included headers
- */
-
-/*
- * Required ARM standard platform porting definitions
- */
-#define PLAT_ARM_CLUSTER0_CORE_COUNT   4
-#define PLAT_ARM_CLUSTER1_CORE_COUNT   4
-
-#define PLAT_ARM_TRUSTED_ROM_BASE      0x00000000
-#define PLAT_ARM_TRUSTED_ROM_SIZE      0x04000000      /* 64 MB */
-
-#define PLAT_ARM_TRUSTED_DRAM_BASE     0x06000000
-#define PLAT_ARM_TRUSTED_DRAM_SIZE     0x02000000      /* 32 MB */
-
-/* No SCP in FVP */
-#define PLAT_ARM_SCP_TZC_DRAM1_SIZE    MAKE_ULL(0x0)
-
-#define PLAT_ARM_DRAM2_SIZE            MAKE_ULL(0x780000000)
-
-#define PLAT_ARM_SHARED_RAM_CACHED     1
-
-/*
- * Load address of BL3-3 for this platform port
- */
-#define PLAT_ARM_NS_IMAGE_OFFSET       (ARM_DRAM1_BASE + 0x8000000)
-
-
-/*
- * PL011 related constants
- */
-#define PLAT_ARM_BOOT_UART_BASE                V2M_IOFPGA_UART0_BASE
-#define PLAT_ARM_BOOT_UART_CLK_IN_HZ   V2M_IOFPGA_UART0_CLK_IN_HZ
-
-#define PLAT_ARM_CRASH_UART_BASE       V2M_IOFPGA_UART1_BASE
-#define PLAT_ARM_CRASH_UART_CLK_IN_HZ  V2M_IOFPGA_UART1_CLK_IN_HZ
-
-#define PLAT_ARM_TSP_UART_BASE         V2M_IOFPGA_UART2_BASE
-#define PLAT_ARM_TSP_UART_CLK_IN_HZ    V2M_IOFPGA_UART2_CLK_IN_HZ
-
-/* CCI related constants */
-#define PLAT_ARM_CCI_BASE              0x2c090000
-#define PLAT_ARM_CCI_CLUSTER0_SL_IFACE_IX      3
-#define PLAT_ARM_CCI_CLUSTER1_SL_IFACE_IX      4
-
-/* TrustZone controller related constants
- *
- * Currently only filters 0 and 2 are connected on Base FVP.
- * Filter 0 : CPU clusters (no access to DRAM by default)
- * Filter 1 : not connected
- * Filter 2 : LCDs (access to VRAM allowed by default)
- * Filter 3 : not connected
- * Programming unconnected filters will have no effect at the
- * moment. These filter could, however, be connected in future.
- * So care should be taken not to configure the unused filters.
- *
- * Allow only non-secure access to all DRAM to supported devices.
- * Give access to the CPUs and Virtio. Some devices
- * would normally use the default ID so allow that too.
- */
-#define PLAT_ARM_TZC_FILTERS           REG_ATTR_FILTER_BIT(0)
-
-#define PLAT_ARM_TZC_NS_DEV_ACCESS     (                               \
-               TZC_REGION_ACCESS_RDWR(FVP_NSAID_DEFAULT)       |       \
-               TZC_REGION_ACCESS_RDWR(FVP_NSAID_PCI)           |       \
-               TZC_REGION_ACCESS_RDWR(FVP_NSAID_AP)            |       \
-               TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO)        |       \
-               TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO_OLD))
-
-
-#endif /* __PLATFORM_DEF_H__ */
diff --git a/plat/fvp/include/platform_oid.h b/plat/fvp/include/platform_oid.h
deleted file mode 100644 (file)
index 1e44cf7..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#include "../../../../../include/plat/arm/board/common/board_arm_oid.h"
-
-/*
- * Required platform OIDs
- * (Provided by included header)
- */
diff --git a/plat/fvp/platform.mk b/plat/fvp/platform.mk
deleted file mode 100644 (file)
index c20cd08..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-#
-# Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# Neither the name of ARM nor the names of its contributors may be used
-# to endorse or promote products derived from this software without specific
-# prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-
-PLAT_INCLUDES          :=      -Iinclude/plat/arm/board/common                 \
-                               -Iplat/fvp/include
-
-
-PLAT_BL_COMMON_SOURCES :=      drivers/arm/pl011/pl011_console.S               \
-                               plat/fvp/aarch64/fvp_common.c
-
-BL1_SOURCES            +=      drivers/io/io_semihosting.c                     \
-                               lib/cpus/aarch64/aem_generic.S                  \
-                               lib/cpus/aarch64/cortex_a53.S                   \
-                               lib/cpus/aarch64/cortex_a57.S                   \
-                               lib/semihosting/semihosting.c                   \
-                               lib/semihosting/aarch64/semihosting_call.S      \
-                               plat/fvp/aarch64/fvp_helpers.S                  \
-                               plat/fvp/bl1_fvp_setup.c                        \
-                               plat/fvp/fvp_io_storage.c
-
-BL2_SOURCES            +=      drivers/io/io_semihosting.c                     \
-                               lib/semihosting/semihosting.c                   \
-                               lib/semihosting/aarch64/semihosting_call.S      \
-                               plat/fvp/bl2_fvp_setup.c                        \
-                               plat/fvp/fvp_io_storage.c                       \
-                               plat/fvp/fvp_security.c
-
-BL31_SOURCES           +=      lib/cpus/aarch64/aem_generic.S                  \
-                               lib/cpus/aarch64/cortex_a53.S                   \
-                               lib/cpus/aarch64/cortex_a57.S                   \
-                               plat/fvp/bl31_fvp_setup.c                       \
-                               plat/fvp/fvp_pm.c                               \
-                               plat/fvp/fvp_security.c                         \
-                               plat/fvp/fvp_topology.c                         \
-                               plat/fvp/aarch64/fvp_helpers.S                  \
-                               plat/fvp/drivers/pwrc/fvp_pwrc.c
-
-ifneq (${TRUSTED_BOARD_BOOT},0)
-  BL1_SOURCES          +=      plat/arm/board/common/board_arm_trusted_boot.c
-  BL2_SOURCES          +=      plat/arm/board/common/board_arm_trusted_boot.c
-endif
-
-
-include plat/arm/common/arm_common.mk
diff --git a/plat/fvp/tsp/tsp-fvp.mk b/plat/fvp/tsp/tsp-fvp.mk
deleted file mode 100644 (file)
index 8ba3784..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-#
-# Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# Neither the name of ARM nor the names of its contributors may be used
-# to endorse or promote products derived from this software without specific
-# prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-# TSP source files specific to FVP platform
-BL32_SOURCES           +=      plat/fvp/tsp/tsp_fvp_setup.c
-
-include plat/arm/common/tsp/arm_tsp.mk
diff --git a/plat/fvp/tsp/tsp_fvp_setup.c b/plat/fvp/tsp/tsp_fvp_setup.c
deleted file mode 100644 (file)
index 64246db..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <plat_arm.h>
-#include "../fvp_private.h"
-
-void tsp_early_platform_setup(void)
-{
-       arm_tsp_early_platform_setup();
-
-       /* Initialize the platform config for future decision making */
-       fvp_config_setup();
-}