GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
+70
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Marvell International Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* https://spdx.org/licenses
|
||||
*/
|
||||
|
||||
#include <plat_marvell.h>
|
||||
|
||||
|
||||
/* MMU entry for internal (register) space access */
|
||||
#define MAP_DEVICE0 MAP_REGION_FLAT(DEVICE0_BASE, \
|
||||
DEVICE0_SIZE, \
|
||||
MT_DEVICE | MT_RW | MT_SECURE)
|
||||
|
||||
/*
|
||||
* Table of regions for various BL stages to map using the MMU.
|
||||
*/
|
||||
#if IMAGE_BL1
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MARVELL_MAP_SECURE_RAM,
|
||||
MAP_DEVICE0,
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
#if IMAGE_BL2
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MARVELL_MAP_SECURE_RAM,
|
||||
MAP_DEVICE0,
|
||||
MARVELL_MAP_DRAM,
|
||||
#ifdef SPD_opteed
|
||||
MARVELL_MAP_OPTEE_CORE_MEM,
|
||||
MARVELL_OPTEE_PAGEABLE_LOAD_MEM,
|
||||
#endif
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IMAGE_BL2U
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MARVELL_MAP_SECURE_RAM,
|
||||
MAP_DEVICE0,
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IMAGE_BLE
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MAP_DEVICE0,
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IMAGE_BL31
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MARVELL_MAP_SECURE_RAM,
|
||||
MAP_DEVICE0,
|
||||
MARVELL_MAP_DRAM,
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
#if IMAGE_BL32
|
||||
const mmap_region_t plat_marvell_mmap[] = {
|
||||
MARVELL_MAP_SECURE_RAM,
|
||||
MAP_DEVICE0,
|
||||
{0}
|
||||
};
|
||||
#endif
|
||||
|
||||
MARVELL_CASSERT_MMAP;
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Marvell International Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* https://spdx.org/licenses
|
||||
*/
|
||||
|
||||
#include <arch_helpers.h>
|
||||
#include <common/debug.h>
|
||||
#include <drivers/marvell/cache_llc.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
#define CCU_HTC_ASET (MVEBU_CCU_BASE(MVEBU_AP0) + 0x264)
|
||||
#define MVEBU_IO_AFFINITY (0xF00)
|
||||
#define MVEBU_SF_REG (MVEBU_REGS_BASE + 0x40)
|
||||
#define MVEBU_SF_EN BIT(8)
|
||||
#define MVEBU_DFX_REG(cluster_id) (MVEBU_REGS_BASE + 0x6F82A0 + \
|
||||
(cluster_id) * 0x4)
|
||||
#define MVEBU_DFX_CLK_EN_POS 0x3
|
||||
#define MVEBU_DFX_CL0_CLK_OFFS 16
|
||||
#define MVEBU_DFX_CL0_CLK_MASK (0xF << MVEBU_DFX_CL0_CLK_OFFS)
|
||||
#define MVEBU_DFX_CL1_CLK_OFFS 8
|
||||
#define MVEBU_DFX_CL1_CLK_MASK (0xF << MVEBU_DFX_CL1_CLK_OFFS)
|
||||
|
||||
#ifdef MVEBU_SOC_AP807
|
||||
static void plat_enable_snoop_filter(void)
|
||||
{
|
||||
int cpu_id = plat_my_core_pos();
|
||||
|
||||
/* Snoop filter needs to be enabled once per cluster */
|
||||
if (cpu_id % 2)
|
||||
return;
|
||||
|
||||
mmio_setbits_32(MVEBU_SF_REG, MVEBU_SF_EN);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MVEBU_SOC_AP807
|
||||
static void plat_config_dfx_clock(void)
|
||||
{
|
||||
int cluster_id = plat_my_core_pos();
|
||||
uint32_t val;
|
||||
|
||||
/* DFX clock needs to be configured once per cluster */
|
||||
if ((cluster_id % PLAT_MAX_CPUS_PER_CLUSTER) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
val = mmio_read_32(MVEBU_DFX_REG(cluster_id / PLAT_MAX_CPUS_PER_CLUSTER));
|
||||
if (cluster_id == 0) {
|
||||
val &= ~MVEBU_DFX_CL0_CLK_MASK;
|
||||
val |= (MVEBU_DFX_CLK_EN_POS << MVEBU_DFX_CL0_CLK_OFFS);
|
||||
} else {
|
||||
val &= ~MVEBU_DFX_CL1_CLK_MASK;
|
||||
val |= (MVEBU_DFX_CLK_EN_POS << MVEBU_DFX_CL1_CLK_OFFS);
|
||||
}
|
||||
mmio_write_32(MVEBU_DFX_REG(cluster_id / PLAT_MAX_CPUS_PER_CLUSTER), val);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void plat_enable_affinity(void)
|
||||
{
|
||||
int cluster_id;
|
||||
int affinity;
|
||||
|
||||
/* set CPU Affinity */
|
||||
cluster_id = plat_my_core_pos() / PLAT_MARVELL_CLUSTER_CORE_COUNT;
|
||||
affinity = (MVEBU_IO_AFFINITY | (1 << cluster_id));
|
||||
mmio_write_32(CCU_HTC_ASET, affinity);
|
||||
|
||||
/* set barier */
|
||||
isb();
|
||||
}
|
||||
|
||||
void marvell_psci_arch_init(int die_index)
|
||||
{
|
||||
#if LLC_ENABLE
|
||||
/* check if LLC is in exclusive mode
|
||||
* as L2 is configured to UniqueClean eviction
|
||||
* (in a8k reset handler)
|
||||
*/
|
||||
if (llc_is_exclusive(0) == 0)
|
||||
ERROR("LLC should be configured to exclusice mode\n");
|
||||
#endif
|
||||
|
||||
/* Enable Affinity */
|
||||
plat_enable_affinity();
|
||||
|
||||
#ifdef MVEBU_SOC_AP807
|
||||
plat_enable_snoop_filter();
|
||||
#else
|
||||
plat_config_dfx_clock();
|
||||
#endif
|
||||
}
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Marvell International Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* https://spdx.org/licenses
|
||||
*/
|
||||
|
||||
#include <asm_macros.S>
|
||||
#include <platform_def.h>
|
||||
#include <marvell_pm.h>
|
||||
|
||||
.globl plat_secondary_cold_boot_setup
|
||||
.globl plat_get_my_entrypoint
|
||||
.globl plat_is_my_cpu_primary
|
||||
.globl plat_reset_handler
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* void plat_secondary_cold_boot_setup (void);
|
||||
*
|
||||
* This function performs any platform specific actions
|
||||
* needed for a secondary cpu after a cold reset. Right
|
||||
* now this is a stub function.
|
||||
* -----------------------------------------------------
|
||||
*/
|
||||
func plat_secondary_cold_boot_setup
|
||||
mov x0, #0
|
||||
ret
|
||||
endfunc plat_secondary_cold_boot_setup
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* unsigned long plat_get_my_entrypoint (void);
|
||||
*
|
||||
* Main job of this routine is to distinguish
|
||||
* between a cold and warm boot
|
||||
* For a cold boot, return 0.
|
||||
* For a warm boot, read the mailbox and return the address it contains.
|
||||
*
|
||||
* ---------------------------------------------------------------------
|
||||
*/
|
||||
func plat_get_my_entrypoint
|
||||
/* Read first word and compare it with magic num */
|
||||
mov_imm x0, PLAT_MARVELL_MAILBOX_BASE
|
||||
ldr x1, [x0]
|
||||
mov_imm x2, MVEBU_MAILBOX_MAGIC_NUM
|
||||
cmp x1, x2
|
||||
beq warm_boot /* If compare failed, return 0, i.e. cold boot */
|
||||
mov x0, #0
|
||||
ret
|
||||
warm_boot:
|
||||
mov_imm x1, MBOX_IDX_SEC_ADDR /* Get the jump address */
|
||||
subs x1, x1, #1
|
||||
mov x2, #(MBOX_IDX_SEC_ADDR * 8)
|
||||
lsl x3, x2, x1
|
||||
add x0, x0, x3
|
||||
ldr x0, [x0]
|
||||
ret
|
||||
endfunc plat_get_my_entrypoint
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* unsigned int plat_is_my_cpu_primary (void);
|
||||
*
|
||||
* Find out whether the current cpu is the primary
|
||||
* cpu.
|
||||
* -----------------------------------------------------
|
||||
*/
|
||||
func plat_is_my_cpu_primary
|
||||
mrs x0, mpidr_el1
|
||||
and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
|
||||
cmp x0, #MVEBU_PRIMARY_CPU
|
||||
cset w0, eq
|
||||
ret
|
||||
endfunc plat_is_my_cpu_primary
|
||||
|
||||
/* -----------------------------------------------------
|
||||
* void plat_reset_handler (void);
|
||||
*
|
||||
* Platform specific configuration right after cpu is
|
||||
* is our of reset.
|
||||
*
|
||||
* The plat_reset_handler can clobber x0 - x18, x30.
|
||||
* -----------------------------------------------------
|
||||
*/
|
||||
func plat_reset_handler
|
||||
/*
|
||||
* Note: the configurations below should be done before MMU,
|
||||
* I Cache and L2are enabled.
|
||||
* The reset handler is executed right after reset
|
||||
* and before Caches are enabled.
|
||||
*/
|
||||
|
||||
/* Enable L1/L2 ECC and Parity */
|
||||
mrs x5, s3_1_c11_c0_2 /* L2 Ctrl */
|
||||
orr x5, x5, #(1 << 21) /* Enable L1/L2 cache ECC & Parity */
|
||||
msr s3_1_c11_c0_2, x5 /* L2 Ctrl */
|
||||
|
||||
#if LLC_ENABLE
|
||||
/*
|
||||
* Enable L2 UniqueClean evictions
|
||||
* Note: this configuration assumes that LLC is configured
|
||||
* in exclusive mode.
|
||||
* Later on in the code this assumption will be validated
|
||||
*/
|
||||
mrs x5, s3_1_c15_c0_0 /* L2 Ctrl */
|
||||
orr x5, x5, #(1 << 14) /* Enable UniqueClean evictions with data */
|
||||
msr s3_1_c15_c0_0, x5 /* L2 Ctrl */
|
||||
#endif
|
||||
|
||||
/* Instruction Barrier to allow msr command completion */
|
||||
isb
|
||||
|
||||
ret
|
||||
endfunc plat_reset_handler
|
||||
Reference in New Issue
Block a user