Merge pull request #1655 from deepan02/deepak-arm/introduce-n1sdp
plat/arm: Introduce the N1SDP.
This commit is contained in:
commit
b3f7c42d37
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <arch.h>
|
||||
#include <asm_macros.S>
|
||||
#include <cortex_ares.h>
|
||||
#include <cpu_macros.S>
|
||||
#include <platform_def.h>
|
||||
|
||||
.globl plat_arm_calc_core_pos
|
||||
.globl plat_reset_handler
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
|
||||
*
|
||||
* Helper function to calculate the core position.
|
||||
* (ClusterId * N1SDP_MAX_CPUS_PER_CLUSTER * N1SDP_MAX_PE_PER_CPU) +
|
||||
* (CPUId * N1SDP_MAX_PE_PER_CPU) +
|
||||
* ThreadId
|
||||
*
|
||||
* which can be simplified as:
|
||||
*
|
||||
* ((ClusterId * N1SDP_MAX_CPUS_PER_CLUSTER + CPUId) *
|
||||
* N1SDP_MAX_PE_PER_CPU) + ThreadId
|
||||
* ------------------------------------------------------
|
||||
*/
|
||||
|
||||
func plat_arm_calc_core_pos
|
||||
mov x3, x0
|
||||
|
||||
/*
|
||||
* The MT bit in MPIDR is always set for n1sdp and the
|
||||
* affinity level 0 corresponds to thread affinity level.
|
||||
*/
|
||||
|
||||
/* Extract individual affinity fields from MPIDR */
|
||||
ubfx x0, x3, #MPIDR_AFF0_SHIFT, #MPIDR_AFFINITY_BITS
|
||||
ubfx x1, x3, #MPIDR_AFF1_SHIFT, #MPIDR_AFFINITY_BITS
|
||||
ubfx x2, x3, #MPIDR_AFF2_SHIFT, #MPIDR_AFFINITY_BITS
|
||||
|
||||
/* Compute linear position */
|
||||
mov x4, #N1SDP_MAX_CPUS_PER_CLUSTER
|
||||
madd x1, x2, x4, x1
|
||||
mov x5, #N1SDP_MAX_PE_PER_CPU
|
||||
madd x0, x1, x5, x0
|
||||
ret
|
||||
endfunc plat_arm_calc_core_pos
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* void plat_reset_handler(void);
|
||||
*
|
||||
* Determine the CPU MIDR and disable power down bit for
|
||||
* that CPU.
|
||||
* -----------------------------------------------------
|
||||
*/
|
||||
|
||||
func plat_reset_handler
|
||||
jump_if_cpu_midr CORTEX_ARES_MIDR, ARES
|
||||
ret
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* Disable CPU power down bit in power control register
|
||||
* -----------------------------------------------------
|
||||
*/
|
||||
ARES:
|
||||
mrs x0, CORTEX_ARES_CPUPWRCTLR_EL1
|
||||
bic x0, x0, #CORTEX_ARES_CORE_PWRDN_EN_MASK
|
||||
msr CORTEX_ARES_CPUPWRCTLR_EL1, x0
|
||||
isb
|
||||
ret
|
||||
endfunc plat_reset_handler
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#ifndef __PLAT_MACROS_S__
|
||||
#define __PLAT_MACROS_S__
|
||||
|
||||
#include <css_macros.S>
|
||||
|
||||
/* ---------------------------------------------
|
||||
* The below required platform porting macro
|
||||
* prints out relevant platform registers
|
||||
* whenever an unhandled exception is taken in
|
||||
* BL31.
|
||||
*
|
||||
* There are currently no platform specific regs
|
||||
* to print.
|
||||
* ---------------------------------------------
|
||||
*/
|
||||
.macro plat_crash_print_regs
|
||||
.endm
|
||||
#endif /* __PLAT_MACROS_S__ */
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef __PLATFORM_DEF_H__
|
||||
#define __PLATFORM_DEF_H__
|
||||
|
||||
#include <arm_def.h>
|
||||
#include <board_css_def.h>
|
||||
#include <css_def.h>
|
||||
|
||||
#if CSS_USE_SCMI_SDS_DRIVER
|
||||
#define N1SDP_SCMI_PAYLOAD_BASE 0x45400000
|
||||
#else
|
||||
#define PLAT_CSS_SCP_COM_SHARED_MEM_BASE 0x45400000
|
||||
#endif
|
||||
|
||||
#define PLAT_ARM_TRUSTED_SRAM_SIZE 0x00080000 /* 512 KB */
|
||||
#define PLAT_ARM_MAX_BL31_SIZE 0X20000
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* N1SDP topology related constants
|
||||
******************************************************************************/
|
||||
#define N1SDP_MAX_CPUS_PER_CLUSTER 2
|
||||
#define PLAT_ARM_CLUSTER_COUNT 2
|
||||
#define N1SDP_MAX_PE_PER_CPU 1
|
||||
|
||||
#define PLATFORM_CORE_COUNT (PLAT_ARM_CLUSTER_COUNT * \
|
||||
N1SDP_MAX_CPUS_PER_CLUSTER * \
|
||||
N1SDP_MAX_PE_PER_CPU)
|
||||
|
||||
|
||||
/*
|
||||
* PLAT_ARM_MMAP_ENTRIES depends on the number of entries in the
|
||||
* plat_arm_mmap array defined for each BL stage.
|
||||
*/
|
||||
#define PLAT_ARM_MMAP_ENTRIES 3
|
||||
#define MAX_XLAT_TABLES 4
|
||||
|
||||
#define PLATFORM_STACK_SIZE 0x400
|
||||
|
||||
#define PLAT_ARM_NSTIMER_FRAME_ID 0
|
||||
#define PLAT_CSS_MHU_BASE 0x45000000
|
||||
#define PLAT_MAX_PWR_LVL 1
|
||||
|
||||
#define PLAT_ARM_G1S_IRQS ARM_G1S_IRQS, \
|
||||
CSS_IRQ_MHU
|
||||
#define PLAT_ARM_G0_IRQS ARM_G0_IRQS
|
||||
|
||||
#define PLAT_ARM_G1S_IRQ_PROPS(grp) CSS_G1S_IRQ_PROPS(grp)
|
||||
#define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp)
|
||||
|
||||
|
||||
#define N1SDP_DEVICE_BASE (0x20000000)
|
||||
#define N1SDP_DEVICE_SIZE (0x20000000)
|
||||
#define N1SDP_MAP_DEVICE MAP_REGION_FLAT( \
|
||||
N1SDP_DEVICE_BASE, \
|
||||
N1SDP_DEVICE_SIZE, \
|
||||
MT_DEVICE | MT_RW | MT_SECURE)
|
||||
|
||||
/* GIC related constants */
|
||||
#define PLAT_ARM_GICD_BASE 0x30000000
|
||||
#define PLAT_ARM_GICC_BASE 0x2C000000
|
||||
#define PLAT_ARM_GICR_BASE 0x300C0000
|
||||
|
||||
/* Platform ID address */
|
||||
#define SSC_VERSION (SSC_REG_BASE + SSC_VERSION_OFFSET)
|
||||
#endif /* __PLATFORM_DEF_H__ */
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include "../../css/drivers/scmi/scmi.h"
|
||||
#include "../../css/drivers/mhu/css_mhu_doorbell.h"
|
||||
#include <platform_def.h>
|
||||
|
||||
static scmi_channel_plat_info_t n1sdp_scmi_plat_info = {
|
||||
.scmi_mbx_mem = N1SDP_SCMI_PAYLOAD_BASE,
|
||||
.db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF,
|
||||
.db_preserve_mask = 0xfffffffe,
|
||||
.db_modify_mask = 0x1,
|
||||
.ring_doorbell = &mhu_ring_doorbell,
|
||||
};
|
||||
|
||||
scmi_channel_plat_info_t *plat_css_get_scmi_info()
|
||||
{
|
||||
return &n1sdp_scmi_plat_info;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* For N1SDP which support FCM (with automatic interconnect enter/exit),
|
||||
* we should not do anything in these interface functions.
|
||||
* They are used to override the weak functions in cci drivers.
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* Helper function to initialize ARM interconnect driver.
|
||||
*****************************************************************************/
|
||||
void plat_arm_interconnect_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Helper function to place current master into coherency
|
||||
*****************************************************************************/
|
||||
void plat_arm_interconnect_enter_coherency(void)
|
||||
{
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Helper function to remove current master from coherency
|
||||
*****************************************************************************/
|
||||
void plat_arm_interconnect_exit_coherency(void)
|
||||
{
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <arm_def.h>
|
||||
#include <bl_common.h>
|
||||
#include <debug.h>
|
||||
#include <plat_arm.h>
|
||||
#include <platform.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
/*
|
||||
* Table of regions to map using the MMU.
|
||||
* Replace or extend the below regions as required
|
||||
*/
|
||||
|
||||
const mmap_region_t plat_arm_mmap[] = {
|
||||
ARM_MAP_SHARED_RAM,
|
||||
N1SDP_MAP_DEVICE,
|
||||
SOC_CSS_MAP_DEVICE,
|
||||
{0}
|
||||
};
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
/*
|
||||
* TZC programming is currently not done.
|
||||
*/
|
||||
void plat_arm_security_setup(void)
|
||||
{
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <plat_arm.h>
|
||||
|
||||
/* Topology */
|
||||
typedef struct n1sdp_topology {
|
||||
const unsigned char *power_tree;
|
||||
unsigned int plat_cluster_core_count;
|
||||
} n1sdp_topology_t;
|
||||
|
||||
/*
|
||||
* The power domain tree descriptor. The cluster power domains are
|
||||
* arranged so that when the PSCI generic code creates the power domain tree,
|
||||
* the indices of the CPU power domain nodes it allocates match the linear
|
||||
* indices returned by plat_core_pos_by_mpidr().
|
||||
*/
|
||||
const unsigned char n1sdp_pd_tree_desc[] = {
|
||||
PLAT_ARM_CLUSTER_COUNT,
|
||||
N1SDP_MAX_CPUS_PER_CLUSTER,
|
||||
N1SDP_MAX_CPUS_PER_CLUSTER
|
||||
};
|
||||
|
||||
/* Topology configuration for n1sdp */
|
||||
const n1sdp_topology_t n1sdp_topology = {
|
||||
.power_tree = n1sdp_pd_tree_desc,
|
||||
.plat_cluster_core_count = N1SDP_MAX_CPUS_PER_CLUSTER
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* This function returns the topology tree information.
|
||||
******************************************************************************/
|
||||
const unsigned char *plat_get_power_domain_tree_desc(void)
|
||||
{
|
||||
return n1sdp_topology.power_tree;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* This function returns the core count within the cluster corresponding to
|
||||
* `mpidr`.
|
||||
******************************************************************************/
|
||||
unsigned int plat_arm_get_cluster_core_count(u_register_t mpidr)
|
||||
{
|
||||
return n1sdp_topology.plat_cluster_core_count;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* The array mapping platform core position (implemented by plat_my_core_pos())
|
||||
* to the SCMI power domain ID implemented by SCP.
|
||||
******************************************************************************/
|
||||
const uint32_t plat_css_core_pos_to_scmi_dmn_id_map[PLATFORM_CORE_COUNT] = {
|
||||
0, 1, 2, 3};
|
|
@ -0,0 +1,67 @@
|
|||
#
|
||||
# Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
||||
|
||||
N1SDP_BASE := plat/arm/board/n1sdp
|
||||
|
||||
INTERCONNECT_SOURCES := ${N1SDP_BASE}/n1sdp_interconnect.c
|
||||
|
||||
PLAT_INCLUDES := -I${N1SDP_BASE}/include
|
||||
|
||||
|
||||
N1SDP_CPU_SOURCES := lib/cpus/aarch64/cortex_ares.S
|
||||
|
||||
|
||||
N1SDP_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \
|
||||
drivers/arm/gic/v3/gicv3_main.c \
|
||||
drivers/arm/gic/v3/gicv3_helpers.c \
|
||||
plat/common/plat_gicv3.c \
|
||||
plat/arm/common/arm_gicv3.c \
|
||||
drivers/arm/gic/v3/gic600.c
|
||||
|
||||
PLAT_BL_COMMON_SOURCES := ${N1SDP_BASE}/n1sdp_plat.c \
|
||||
${N1SDP_BASE}/aarch64/n1sdp_helper.S
|
||||
|
||||
|
||||
BL31_SOURCES := ${N1SDP_CPU_SOURCES} \
|
||||
${INTERCONNECT_SOURCES} \
|
||||
${N1SDP_GIC_SOURCES} \
|
||||
${N1SDP_BASE}/n1sdp_bl31_setup.c \
|
||||
${N1SDP_BASE}/n1sdp_topology.c \
|
||||
${N1SDP_BASE}/n1sdp_security.c
|
||||
|
||||
|
||||
# TF-A not required to load the SCP Images
|
||||
override CSS_LOAD_SCP_IMAGES := 0
|
||||
|
||||
# BL1/BL2 Image not a part of the capsule Image for n1sdp
|
||||
override NEED_BL1 := no
|
||||
override NEED_BL2 := no
|
||||
override NEED_BL2U := no
|
||||
|
||||
#TFA for n1sdp starts from BL31
|
||||
override RESET_TO_BL31 := 1
|
||||
|
||||
# 32 bit mode not supported
|
||||
override CTX_INCLUDE_AARCH32_REGS := 0
|
||||
|
||||
override ARM_PLAT_MT := 1
|
||||
|
||||
# Select SCMI/SDS drivers instead of SCPI/BOM driver for communicating with the
|
||||
# SCP during power management operations and for SCP RAM Firmware transfer.
|
||||
CSS_USE_SCMI_SDS_DRIVER := 1
|
||||
|
||||
# System coherency is managed in hardware
|
||||
HW_ASSISTED_COHERENCY := 1
|
||||
|
||||
# When building for systems with hardware-assisted coherency, there's no need to
|
||||
# use USE_COHERENT_MEM. Require that USE_COHERENT_MEM must be set to 0 too.
|
||||
USE_COHERENT_MEM := 0
|
||||
include plat/arm/common/arm_common.mk
|
||||
include plat/arm/css/common/css_common.mk
|
||||
include plat/arm/soc/common/soc_css.mk
|
||||
include plat/arm/board/common/board_common.mk
|
||||
|
Loading…
Reference in New Issue