Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
8c94f82c
Commit
8c94f82c
authored
May 27, 2016
by
danh-arm
Browse files
Merge pull request #627 from soby-mathew/sm/fvp_ccn502_sup_1
Add CCN support to FVP
parents
e141aa03
71237876
Changes
10
Hide whitespace changes
Inline
Side-by-side
docs/user-guide.md
View file @
8c94f82c
...
@@ -496,6 +496,14 @@ map is explained in the [Firmware Design].
...
@@ -496,6 +496,14 @@ map is explained in the [Firmware Design].
for functions that wait for an arbitrary time length (udelay and mdelay).
for functions that wait for an arbitrary time length (udelay and mdelay).
The default value is 0.
The default value is 0.
*
`FVP_INTERCONNECT_DRIVER`
: Selects the interconnect driver to be built. The
default interconnect driver depends on the value of
`FVP_CLUSTER_COUNT`
as
explained in the options below:
-
`FVP_CCI`
: The CCI driver is selected. This is the default
if 0 <
`FVP_CLUSTER_COUNT`
<= 2.
-
`FVP_CCN`
: The CCN driver is selected. This is the default
if
`FVP_CLUSTER_COUNT`
> 2.
### Debugging options
### Debugging options
To compile a debug version and make the build more verbose use
To compile a debug version and make the build more verbose use
...
...
drivers/arm/ccn/ccn.c
View file @
8c94f82c
...
@@ -254,6 +254,7 @@ static unsigned long long ccn_master_to_rn_id_map(unsigned long long master_map)
...
@@ -254,6 +254,7 @@ static unsigned long long ccn_master_to_rn_id_map(unsigned long long master_map)
assert
(
ccn_plat_desc
);
assert
(
ccn_plat_desc
);
FOR_EACH_PRESENT_MASTER_INTERFACE
(
iface_id
,
master_map
)
{
FOR_EACH_PRESENT_MASTER_INTERFACE
(
iface_id
,
master_map
)
{
assert
(
iface_id
<
ccn_plat_desc
->
num_masters
);
/* Convert the master ID into the node ID */
/* Convert the master ID into the node ID */
node_id
=
ccn_plat_desc
->
master_to_rn_id_map
[
iface_id
];
node_id
=
ccn_plat_desc
->
master_to_rn_id_map
[
iface_id
];
...
@@ -501,3 +502,15 @@ void ccn_program_sys_addrmap(unsigned int sn0_id,
...
@@ -501,3 +502,15 @@ void ccn_program_sys_addrmap(unsigned int sn0_id,
}
}
}
}
/*******************************************************************************
* This function returns the part0 id from the peripheralID 0 register
* in CCN. This id can be used to distinguish the CCN variant present in the
* system.
******************************************************************************/
int
ccn_get_part0_id
(
uintptr_t
periphbase
)
{
assert
(
periphbase
);
return
(
int
)(
mmio_read_64
(
periphbase
+
MN_PERIPH_ID_0_1_OFFSET
)
&
0xFF
);
}
drivers/arm/ccn/ccn_private.h
View file @
8c94f82c
...
@@ -149,6 +149,7 @@ typedef enum rn_types {
...
@@ -149,6 +149,7 @@ typedef enum rn_types {
#define MN_DDC_STAT_OFFSET DOMAIN_CTRL_STAT_OFFSET
#define MN_DDC_STAT_OFFSET DOMAIN_CTRL_STAT_OFFSET
#define MN_DDC_SET_OFFSET DOMAIN_CTRL_SET_OFFSET
#define MN_DDC_SET_OFFSET DOMAIN_CTRL_SET_OFFSET
#define MN_DDC_CLR_OFFSET DOMAIN_CTRL_CLR_OFFSET
#define MN_DDC_CLR_OFFSET DOMAIN_CTRL_CLR_OFFSET
#define MN_PERIPH_ID_0_1_OFFSET 0xFE0
#define MN_ID_OFFSET REGION_ID_OFFSET
#define MN_ID_OFFSET REGION_ID_OFFSET
/* HNF System Address Map register bit masks and shifts */
/* HNF System Address Map register bit masks and shifts */
...
...
include/drivers/arm/ccn.h
View file @
8c94f82c
...
@@ -51,6 +51,13 @@
...
@@ -51,6 +51,13 @@
#define CCN_L3_RUN_MODE_HAM 0x2
/* HNF_PM_HALF */
#define CCN_L3_RUN_MODE_HAM 0x2
/* HNF_PM_HALF */
#define CCN_L3_RUN_MODE_FAM 0x3
/* HNF_PM_FULL */
#define CCN_L3_RUN_MODE_FAM 0x3
/* HNF_PM_FULL */
/* part 0 IDs for various CCN variants */
#define CCN_502_PART0_ID 0x30
#define CCN_504_PART0_ID 0x26
#define CCN_505_PART0_ID 0x27
#define CCN_508_PART0_ID 0x28
#define CCN_512_PART0_ID 0x29
/*
/*
* The following macro takes the value returned from a read of a HN-F P-state
* The following macro takes the value returned from a read of a HN-F P-state
* status register and returns the retention state value.
* status register and returns the retention state value.
...
@@ -107,6 +114,7 @@ void ccn_program_sys_addrmap(unsigned int sn0_id,
...
@@ -107,6 +114,7 @@ void ccn_program_sys_addrmap(unsigned int sn0_id,
unsigned
int
top_addr_bit1
,
unsigned
int
top_addr_bit1
,
unsigned
char
three_sn_en
);
unsigned
char
three_sn_en
);
unsigned
int
ccn_get_l3_run_mode
(
void
);
unsigned
int
ccn_get_l3_run_mode
(
void
);
int
ccn_get_part0_id
(
uintptr_t
periphbase
);
#endif
/* __ASSEMBLY__ */
#endif
/* __ASSEMBLY__ */
#endif
/* __CCN_H__ */
#endif
/* __CCN_H__ */
plat/arm/board/fvp/fvp_common.c
View file @
8c94f82c
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#include <arm_config.h>
#include <arm_config.h>
#include <arm_def.h>
#include <arm_def.h>
#include <ccn.h>
#include <debug.h>
#include <debug.h>
#include <gicv2.h>
#include <gicv2.h>
#include <mmio.h>
#include <mmio.h>
...
@@ -213,8 +214,16 @@ void fvp_config_setup(void)
...
@@ -213,8 +214,16 @@ void fvp_config_setup(void)
void
fvp_interconnect_init
(
void
)
void
fvp_interconnect_init
(
void
)
{
{
if
(
arm_config
.
flags
&
ARM_CONFIG_HAS_INTERCONNECT
)
if
(
arm_config
.
flags
&
ARM_CONFIG_HAS_INTERCONNECT
)
{
#if FVP_INTERCONNECT_DRIVER == FVP_CCN
if
(
ccn_get_part0_id
(
PLAT_ARM_CCN_BASE
)
!=
CCN_502_PART0_ID
)
{
ERROR
(
"Unrecognized CCN variant detected. Only CCN-502"
" is supported"
);
panic
();
}
#endif
plat_arm_interconnect_init
();
plat_arm_interconnect_init
();
}
}
}
void
fvp_interconnect_enable
(
void
)
void
fvp_interconnect_enable
(
void
)
...
...
plat/arm/board/fvp/fvp_def.h
View file @
8c94f82c
...
@@ -40,6 +40,10 @@
...
@@ -40,6 +40,10 @@
#define FVP_PRIMARY_CPU 0x0
#define FVP_PRIMARY_CPU 0x0
/* Defines for the Interconnect build selection */
#define FVP_CCI 1
#define FVP_CCN 2
/*******************************************************************************
/*******************************************************************************
* FVP memory map related constants
* FVP memory map related constants
******************************************************************************/
******************************************************************************/
...
@@ -57,16 +61,23 @@
...
@@ -57,16 +61,23 @@
#define DEVICE0_BASE 0x20000000
#define DEVICE0_BASE 0x20000000
#define DEVICE0_SIZE 0x0c200000
#define DEVICE0_SIZE 0x0c200000
/*
* In case of FVP models with CCN, the CCN register space overlaps into
* the NSRAM area.
*/
#if FVP_INTERCONNECT_DRIVER == FVP_CCN
#define DEVICE1_BASE 0x2e000000
#define DEVICE1_SIZE 0x1A00000
#else
#define DEVICE1_BASE 0x2f000000
#define DEVICE1_BASE 0x2f000000
#define DEVICE1_SIZE 0x200000
#define DEVICE1_SIZE 0x200000
#define NSRAM_BASE 0x2e000000
#define NSRAM_SIZE 0x10000
#endif
/* Devices in the second GB */
/* Devices in the second GB */
#define DEVICE2_BASE 0x7fe00000
#define DEVICE2_BASE 0x7fe00000
#define DEVICE2_SIZE 0x00200000
#define DEVICE2_SIZE 0x00200000
#define NSRAM_BASE 0x2e000000
#define NSRAM_SIZE 0x10000
#define PCIE_EXP_BASE 0x40000000
#define PCIE_EXP_BASE 0x40000000
#define TZRNG_BASE 0x7fe60000
#define TZRNG_BASE 0x7fe60000
...
...
plat/arm/board/fvp/include/plat_macros.S
View file @
8c94f82c
...
@@ -64,7 +64,9 @@ use_ve_mmap:
...
@@ -64,7 +64,9 @@ use_ve_mmap:
mov_imm
x16
,
VE_GICD_BASE
mov_imm
x16
,
VE_GICD_BASE
print_gic_regs
:
print_gic_regs
:
arm_print_gic_regs
arm_print_gic_regs
#if FVP_INTERCONNECT_DRIVER == FVP_CCI
print_cci_regs
print_cci_regs
#endif
.
endm
.
endm
#endif /* __PLAT_MACROS_S__ */
#endif /* __PLAT_MACROS_S__ */
plat/arm/board/fvp/include/platform_def.h
View file @
8c94f82c
...
@@ -90,6 +90,10 @@
...
@@ -90,6 +90,10 @@
#define PLAT_ARM_CCI_CLUSTER0_SL_IFACE_IX 3
#define PLAT_ARM_CCI_CLUSTER0_SL_IFACE_IX 3
#define PLAT_ARM_CCI_CLUSTER1_SL_IFACE_IX 4
#define PLAT_ARM_CCI_CLUSTER1_SL_IFACE_IX 4
/* CCN related constants. Only CCN 502 is currently supported */
#define PLAT_ARM_CCN_BASE 0x2e000000
#define PLAT_ARM_CLUSTER_TO_CCN_ID_MAP 1, 5, 7, 11
/* System timer related constants */
/* System timer related constants */
#define PLAT_ARM_NSTIMER_FRAME_ID 1
#define PLAT_ARM_NSTIMER_FRAME_ID 1
...
...
plat/arm/board/fvp/platform.mk
View file @
8c94f82c
...
@@ -39,11 +39,22 @@ $(eval $(call add_define,FVP_USE_SP804_TIMER))
...
@@ -39,11 +39,22 @@ $(eval $(call add_define,FVP_USE_SP804_TIMER))
# The FVP platform depends on this macro to build with correct GIC driver.
# The FVP platform depends on this macro to build with correct GIC driver.
$(eval
$(call
add_define,FVP_USE_GIC_DRIVER))
$(eval
$(call
add_define,FVP_USE_GIC_DRIVER))
#
If
FVP_CLUSTER_COUNT
has been defined,
pass it into the build system.
#
Define default
FVP_CLUSTER_COUNT
to 2 and
pass it into the build system.
ifdef
FVP_CLUSTER_COUNT
FVP_CLUSTER_COUNT
:=
2
$(eval
$(call
add_define,FVP_CLUSTER_COUNT))
$(eval
$(call
add_define,FVP_CLUSTER_COUNT))
# Sanity check the cluster count and if FVP_CLUSTER_COUNT <= 2,
# choose the CCI driver , else the CCN driver
ifeq
($(FVP_CLUSTER_COUNT), 0)
$(error
"Incorrect cluster count specified for FVP port"
)
else
ifeq
($(FVP_CLUSTER_COUNT),$(filter $(FVP_CLUSTER_COUNT),1 2))
FVP_INTERCONNECT_DRIVER
:=
FVP_CCI
else
FVP_INTERCONNECT_DRIVER
:=
FVP_CCN
endif
endif
$(eval
$(call
add_define,FVP_INTERCONNECT_DRIVER))
# Choose the GIC sources depending upon the how the FVP will be invoked
# Choose the GIC sources depending upon the how the FVP will be invoked
ifeq
(${FVP_USE_GIC_DRIVER}, FVP_GICV3)
ifeq
(${FVP_USE_GIC_DRIVER}, FVP_GICV3)
FVP_GIC_SOURCES
:=
drivers/arm/gic/common/gic_common.c
\
FVP_GIC_SOURCES
:=
drivers/arm/gic/common/gic_common.c
\
...
@@ -67,8 +78,15 @@ else
...
@@ -67,8 +78,15 @@ else
$(error
"Incorrect GIC driver chosen on FVP port"
)
$(error
"Incorrect GIC driver chosen on FVP port"
)
endif
endif
ifeq
(${FVP_INTERCONNECT_DRIVER}, FVP_CCI)
FVP_INTERCONNECT_SOURCES
:=
drivers/arm/cci/cci.c
\
FVP_INTERCONNECT_SOURCES
:=
drivers/arm/cci/cci.c
\
plat/arm/common/arm_cci.c
plat/arm/common/arm_cci.c
else
ifeq
(${FVP_INTERCONNECT_DRIVER}, FVP_CCN)
FVP_INTERCONNECT_SOURCES
:=
drivers/arm/ccn/ccn.c
\
plat/arm/common/arm_ccn.c
else
$(error
"Incorrect CCN driver chosen on FVP port"
)
endif
FVP_SECURITY_SOURCES
:=
drivers/arm/tzc/tzc400.c
\
FVP_SECURITY_SOURCES
:=
drivers/arm/tzc/tzc400.c
\
plat/arm/board/fvp/fvp_security.c
\
plat/arm/board/fvp/fvp_security.c
\
...
...
plat/arm/common/arm_ccn.c
View file @
8c94f82c
...
@@ -43,6 +43,9 @@ static const ccn_desc_t arm_ccn_desc = {
...
@@ -43,6 +43,9 @@ static const ccn_desc_t arm_ccn_desc = {
.
master_to_rn_id_map
=
master_to_rn_id_map
.
master_to_rn_id_map
=
master_to_rn_id_map
};
};
CASSERT
(
PLAT_ARM_CLUSTER_COUNT
==
ARRAY_SIZE
(
master_to_rn_id_map
),
assert_invalid_cluster_count_for_ccn_variant
);
/******************************************************************************
/******************************************************************************
* The following functions are defined as weak to allow a platform to override
* The following functions are defined as weak to allow a platform to override
* the way ARM CCN driver is initialised and used.
* the way ARM CCN driver is initialised and used.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment