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
4108abb4
"backend/vscode:/vscode.git/clone" did not exist on "7cc7e151749ecd44dcdcf2f4be32835c351301f3"
Commit
4108abb4
authored
May 15, 2020
by
Mark Dykes
Committed by
TrustedFirmware Code Review
May 15, 2020
Browse files
Merge "plat/arm/fvp: Support performing SDEI platform setup in runtime" into integration
parents
f95dfc27
cbf9e84a
Changes
14
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
4108abb4
...
@@ -651,6 +651,12 @@ ifeq ($(DYN_DISABLE_AUTH), 1)
...
@@ -651,6 +651,12 @@ ifeq ($(DYN_DISABLE_AUTH), 1)
endif
endif
endif
endif
# SDEI_IN_FCONF is only supported when SDEI_SUPPORT is enabled.
ifeq ($(SDEI_SUPPORT)-$(SDEI_IN_FCONF),0-1)
$(error "
SDEI_IN_FCONF
is
an
experimental
feature
and
is
only
supported
when
\
SDEI_SUPPORT
is
enabled
")
endif
# If pointer authentication is used in the firmware, make sure that all the
# If pointer authentication is used in the firmware, make sure that all the
# registers associated to it are also saved and restored.
# registers associated to it are also saved and restored.
# Not doing it would leak the value of the keys used by EL3 to EL1 and S-EL1.
# Not doing it would leak the value of the keys used by EL3 to EL1 and S-EL1.
...
@@ -882,6 +888,7 @@ $(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
...
@@ -882,6 +888,7 @@ $(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
$(eval $(call assert_boolean,USE_COHERENT_MEM))
$(eval $(call assert_boolean,USE_COHERENT_MEM))
$(eval $(call assert_boolean,USE_DEBUGFS))
$(eval $(call assert_boolean,USE_DEBUGFS))
$(eval $(call assert_boolean,ARM_IO_IN_DTB))
$(eval $(call assert_boolean,ARM_IO_IN_DTB))
$(eval $(call assert_boolean,SDEI_IN_FCONF))
$(eval $(call assert_boolean,USE_ROMLIB))
$(eval $(call assert_boolean,USE_ROMLIB))
$(eval $(call assert_boolean,USE_TBBR_DEFS))
$(eval $(call assert_boolean,USE_TBBR_DEFS))
$(eval $(call assert_boolean,WARMBOOT_ENABLE_DCACHE_EARLY))
$(eval $(call assert_boolean,WARMBOOT_ENABLE_DCACHE_EARLY))
...
@@ -961,6 +968,7 @@ $(eval $(call add_define,TRUSTED_BOARD_BOOT))
...
@@ -961,6 +968,7 @@ $(eval $(call add_define,TRUSTED_BOARD_BOOT))
$(eval
$(call
add_define,USE_COHERENT_MEM))
$(eval
$(call
add_define,USE_COHERENT_MEM))
$(eval
$(call
add_define,USE_DEBUGFS))
$(eval
$(call
add_define,USE_DEBUGFS))
$(eval
$(call
add_define,ARM_IO_IN_DTB))
$(eval
$(call
add_define,ARM_IO_IN_DTB))
$(eval
$(call
add_define,SDEI_IN_FCONF))
$(eval
$(call
add_define,USE_ROMLIB))
$(eval
$(call
add_define,USE_ROMLIB))
$(eval
$(call
add_define,USE_TBBR_DEFS))
$(eval
$(call
add_define,USE_TBBR_DEFS))
$(eval
$(call
add_define,WARMBOOT_ENABLE_DCACHE_EARLY))
$(eval
$(call
add_define,WARMBOOT_ENABLE_DCACHE_EARLY))
...
...
docs/getting_started/build-options.rst
View file @
4108abb4
...
@@ -645,6 +645,11 @@ Common build options
...
@@ -645,6 +645,11 @@ Common build options
configuration
device
tree
,
instead
of
static
structure
in
the
code
base
.
configuration
device
tree
,
instead
of
static
structure
in
the
code
base
.
This
is
currently
an
experimental
feature
.
This
is
currently
an
experimental
feature
.
-
``
SDEI_IN_FCONF
``:
This
flag
determines
whether
to
configure
SDEI
setup
in
runtime
using
firmware
configuration
framework
.
The
platform
specific
SDEI
shared
and
private
events
configuration
is
retrieved
from
device
tree
rather
than
static
C
structures
at
compile
time
.
This
is
currently
an
experimental
feature
and
is
only
supported
if
SDEI_SUPPORT
build
flag
is
enabled
.
-
``
USE_ROMLIB
``:
This
flag
determines
whether
library
at
ROM
will
be
used
.
-
``
USE_ROMLIB
``:
This
flag
determines
whether
library
at
ROM
will
be
used
.
This
feature
creates
a
library
of
functions
to
be
placed
in
ROM
and
thus
This
feature
creates
a
library
of
functions
to
be
placed
in
ROM
and
thus
...
...
fdts/fvp-base-gicv3-psci-common.dtsi
View file @
4108abb4
...
@@ -4,6 +4,8 @@
...
@@ -4,6 +4,8 @@
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
*/
#
include
<
services
/
sdei_flags
.
h
>
/
memreserve
/
0x80000000
0x00010000
;
/
memreserve
/
0x80000000
0x00010000
;
/
{
/
{
...
@@ -36,6 +38,30 @@
...
@@ -36,6 +38,30 @@
max
-
pwr
-
lvl
=
<
2
>;
max
-
pwr
-
lvl
=
<
2
>;
};
};
#
if
SDEI_IN_FCONF
firmware
{
sdei
{
compatible
=
"arm,sdei-1.0"
;
method
=
"smc"
;
private_event_count
=
<
3
>;
shared_event_count
=
<
3
>;
/*
*
Each
event
descriptor
has
typically
3
fields
:
*
1.
Event
number
*
2.
Interrupt
number
the
event
is
bound
to
or
*
if
event
is
dynamic
,
specified
as
SDEI_DYN_IRQ
*
3.
Bit
map
of
event
flags
*/
private_events
=
<
1000
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>,
<
1001
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>,
<
1002
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>;
shared_events
=
<
2000
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>,
<
2001
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>,
<
2002
SDEI_DYN_IRQ
SDEI_MAPF_DYNAMIC
>;
};
};
#
endif
/*
SDEI_IN_FCONF
*/
cpus
{
cpus
{
#
address
-
cells
=
<
2
>;
#
address
-
cells
=
<
2
>;
#
size
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
...
...
include/plat/arm/common/arm_def.h
View file @
4108abb4
...
@@ -565,6 +565,13 @@
...
@@ -565,6 +565,13 @@
/* SGI used for SDEI signalling */
/* SGI used for SDEI signalling */
#define ARM_SDEI_SGI ARM_IRQ_SEC_SGI_0
#define ARM_SDEI_SGI ARM_IRQ_SEC_SGI_0
#if SDEI_IN_FCONF
/* ARM SDEI dynamic private event max count */
#define ARM_SDEI_DP_EVENT_MAX_CNT 3
/* ARM SDEI dynamic shared event max count */
#define ARM_SDEI_DS_EVENT_MAX_CNT 3
#else
/* ARM SDEI dynamic private event numbers */
/* ARM SDEI dynamic private event numbers */
#define ARM_SDEI_DP_EVENT_0 1000
#define ARM_SDEI_DP_EVENT_0 1000
#define ARM_SDEI_DP_EVENT_1 1001
#define ARM_SDEI_DP_EVENT_1 1001
...
@@ -585,5 +592,6 @@
...
@@ -585,5 +592,6 @@
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_0, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC), \
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_0, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC), \
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_1, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC), \
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_1, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC), \
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_2, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC)
SDEI_SHARED_EVENT(ARM_SDEI_DS_EVENT_2, SDEI_DYN_IRQ, SDEI_MAPF_DYNAMIC)
#endif
/* SDEI_IN_FCONF */
#endif
/* ARM_DEF_H */
#endif
/* ARM_DEF_H */
include/plat/arm/common/fconf_sdei_getter.h
0 → 100644
View file @
4108abb4
/*
* Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef FCONF_SDEI_GETTER_H
#define FCONF_SDEI_GETTER_H
#include <lib/fconf/fconf.h>
#include <platform_def.h>
#define sdei__dyn_config_getter(id) sdei_dyn_config.id
struct
sdei_dyn_config_t
{
uint32_t
private_ev_cnt
;
int32_t
private_ev_nums
[
PLAT_SDEI_DP_EVENT_MAX_CNT
];
unsigned
int
private_ev_intrs
[
PLAT_SDEI_DP_EVENT_MAX_CNT
];
unsigned
int
private_ev_flags
[
PLAT_SDEI_DP_EVENT_MAX_CNT
];
uint32_t
shared_ev_cnt
;
int32_t
shared_ev_nums
[
PLAT_SDEI_DS_EVENT_MAX_CNT
];
unsigned
int
shared_ev_intrs
[
PLAT_SDEI_DS_EVENT_MAX_CNT
];
unsigned
int
shared_ev_flags
[
PLAT_SDEI_DS_EVENT_MAX_CNT
];
};
int
fconf_populate_sdei_dyn_config
(
uintptr_t
config
);
extern
struct
sdei_dyn_config_t
sdei_dyn_config
;
#endif
/* FCONF_SDEI_GETTER_H */
include/plat/common/platform.h
View file @
4108abb4
...
@@ -132,6 +132,7 @@ struct meminfo *bl1_plat_sec_mem_layout(void);
...
@@ -132,6 +132,7 @@ struct meminfo *bl1_plat_sec_mem_layout(void);
/* SDEI platform functions */
/* SDEI platform functions */
#if SDEI_SUPPORT
#if SDEI_SUPPORT
void
plat_sdei_setup
(
void
);
int
plat_sdei_validate_entry_point
(
uintptr_t
ep
,
unsigned
int
client_mode
);
int
plat_sdei_validate_entry_point
(
uintptr_t
ep
,
unsigned
int
client_mode
);
void
plat_sdei_handle_masked_trigger
(
uint64_t
mpidr
,
unsigned
int
intr
);
void
plat_sdei_handle_masked_trigger
(
uint64_t
mpidr
,
unsigned
int
intr
);
#endif
#endif
...
...
include/services/sdei.h
View file @
4108abb4
/*
/*
* Copyright (c) 2017-20
18
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-20
20
, ARM Limited and Contributors. All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-License-Identifier: BSD-3-Clause
*/
*/
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
#include <lib/spinlock.h>
#include <lib/spinlock.h>
#include <lib/utils_def.h>
#include <lib/utils_def.h>
#include <services/sdei_flags.h>
/* Range 0xC4000020 - 0xC400003F reserved for SDE 64bit smc calls */
/* Range 0xC4000020 - 0xC400003F reserved for SDE 64bit smc calls */
#define SDEI_VERSION 0xC4000020U
#define SDEI_VERSION 0xC4000020U
...
@@ -41,50 +42,6 @@
...
@@ -41,50 +42,6 @@
#define SDEI_EV_HANDLED 0U
#define SDEI_EV_HANDLED 0U
#define SDEI_EV_FAILED 1U
#define SDEI_EV_FAILED 1U
/* Internal: SDEI flag bit positions */
#define SDEI_MAPF_DYNAMIC_SHIFT_ 1U
#define SDEI_MAPF_BOUND_SHIFT_ 2U
#define SDEI_MAPF_SIGNALABLE_SHIFT_ 3U
#define SDEI_MAPF_PRIVATE_SHIFT_ 4U
#define SDEI_MAPF_CRITICAL_SHIFT_ 5U
#define SDEI_MAPF_EXPLICIT_SHIFT_ 6U
/* SDEI event 0 */
#define SDEI_EVENT_0 0
/* Placeholder interrupt for dynamic mapping */
#define SDEI_DYN_IRQ 0U
/* SDEI flags */
/*
* These flags determine whether or not an event can be associated with an
* interrupt. Static events are permanently associated with an interrupt, and
* can't be changed at runtime. Association of dynamic events with interrupts
* can be changed at run time using the SDEI_INTERRUPT_BIND and
* SDEI_INTERRUPT_RELEASE calls.
*
* SDEI_MAPF_DYNAMIC only indicates run time configurability, where as
* SDEI_MAPF_BOUND indicates interrupt association. For example:
*
* - Calling SDEI_INTERRUPT_BIND on a dynamic event will have both
* SDEI_MAPF_DYNAMIC and SDEI_MAPF_BOUND set.
*
* - Statically-bound events will always have SDEI_MAPF_BOUND set, and neither
* SDEI_INTERRUPT_BIND nor SDEI_INTERRUPT_RELEASE can be called on them.
*
* See also the is_map_bound() macro.
*/
#define SDEI_MAPF_DYNAMIC BIT(SDEI_MAPF_DYNAMIC_SHIFT_)
#define SDEI_MAPF_BOUND BIT(SDEI_MAPF_BOUND_SHIFT_)
#define SDEI_MAPF_EXPLICIT BIT(SDEI_MAPF_EXPLICIT_SHIFT_)
#define SDEI_MAPF_SIGNALABLE BIT(SDEI_MAPF_SIGNALABLE_SHIFT_)
#define SDEI_MAPF_PRIVATE BIT(SDEI_MAPF_PRIVATE_SHIFT_)
#define SDEI_MAPF_NORMAL 0
#define SDEI_MAPF_CRITICAL BIT(SDEI_MAPF_CRITICAL_SHIFT_)
/* Indices of private and shared mappings */
/* Indices of private and shared mappings */
#define SDEI_MAP_IDX_PRIV_ 0U
#define SDEI_MAP_IDX_PRIV_ 0U
#define SDEI_MAP_IDX_SHRD_ 1U
#define SDEI_MAP_IDX_SHRD_ 1U
...
...
include/services/sdei_flags.h
0 → 100644
View file @
4108abb4
/*
* Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SDEI_FLAGS_H
#define SDEI_FLAGS_H
#include <lib/utils_def.h>
/* Internal: SDEI flag bit positions */
#define SDEI_MAPF_DYNAMIC_SHIFT_ 1U
#define SDEI_MAPF_BOUND_SHIFT_ 2U
#define SDEI_MAPF_SIGNALABLE_SHIFT_ 3U
#define SDEI_MAPF_PRIVATE_SHIFT_ 4U
#define SDEI_MAPF_CRITICAL_SHIFT_ 5U
#define SDEI_MAPF_EXPLICIT_SHIFT_ 6U
/* SDEI event 0 */
#define SDEI_EVENT_0 0
/* Placeholder interrupt for dynamic mapping */
#define SDEI_DYN_IRQ 0U
/* SDEI flags */
/*
* These flags determine whether or not an event can be associated with an
* interrupt. Static events are permanently associated with an interrupt, and
* can't be changed at runtime. Association of dynamic events with interrupts
* can be changed at run time using the SDEI_INTERRUPT_BIND and
* SDEI_INTERRUPT_RELEASE calls.
*
* SDEI_MAPF_DYNAMIC only indicates run time configurability, where as
* SDEI_MAPF_BOUND indicates interrupt association. For example:
*
* - Calling SDEI_INTERRUPT_BIND on a dynamic event will have both
* SDEI_MAPF_DYNAMIC and SDEI_MAPF_BOUND set.
*
* - Statically-bound events will always have SDEI_MAPF_BOUND set, and neither
* SDEI_INTERRUPT_BIND nor SDEI_INTERRUPT_RELEASE can be called on them.
*
* See also the is_map_bound() macro.
*/
#define SDEI_MAPF_DYNAMIC BIT(SDEI_MAPF_DYNAMIC_SHIFT_)
#define SDEI_MAPF_BOUND BIT(SDEI_MAPF_BOUND_SHIFT_)
#define SDEI_MAPF_EXPLICIT BIT(SDEI_MAPF_EXPLICIT_SHIFT_)
#define SDEI_MAPF_SIGNALABLE BIT(SDEI_MAPF_SIGNALABLE_SHIFT_)
#define SDEI_MAPF_PRIVATE BIT(SDEI_MAPF_PRIVATE_SHIFT_)
#define SDEI_MAPF_NORMAL 0
#define SDEI_MAPF_CRITICAL BIT(SDEI_MAPF_CRITICAL_SHIFT_)
#endif
/* SDEI_FLAGS_H */
make_helpers/defaults.mk
View file @
4108abb4
...
@@ -223,7 +223,10 @@ USE_COHERENT_MEM := 1
...
@@ -223,7 +223,10 @@ USE_COHERENT_MEM := 1
USE_DEBUGFS
:=
0
USE_DEBUGFS
:=
0
# Build option to fconf based io
# Build option to fconf based io
ARM_IO_IN_DTB
:=
0
ARM_IO_IN_DTB
:=
0
# Build option to support SDEI through fconf
SDEI_IN_FCONF
:=
0
# Build option to choose whether Trusted Firmware uses library at ROM
# Build option to choose whether Trusted Firmware uses library at ROM
USE_ROMLIB
:=
0
USE_ROMLIB
:=
0
...
...
plat/arm/board/fvp/include/platform_def.h
View file @
4108abb4
...
@@ -264,8 +264,13 @@
...
@@ -264,8 +264,13 @@
#define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp)
#define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp)
#if SDEI_IN_FCONF
#define PLAT_SDEI_DP_EVENT_MAX_CNT ARM_SDEI_DP_EVENT_MAX_CNT
#define PLAT_SDEI_DS_EVENT_MAX_CNT ARM_SDEI_DS_EVENT_MAX_CNT
#else
#define PLAT_ARM_PRIVATE_SDEI_EVENTS ARM_SDEI_PRIVATE_EVENTS
#define PLAT_ARM_PRIVATE_SDEI_EVENTS ARM_SDEI_PRIVATE_EVENTS
#define PLAT_ARM_SHARED_SDEI_EVENTS ARM_SDEI_SHARED_EVENTS
#define PLAT_ARM_SHARED_SDEI_EVENTS ARM_SDEI_SHARED_EVENTS
#endif
#define PLAT_ARM_SP_IMAGE_STACK_BASE (PLAT_SP_IMAGE_NS_BUF_BASE + \
#define PLAT_ARM_SP_IMAGE_STACK_BASE (PLAT_SP_IMAGE_NS_BUF_BASE + \
PLAT_SP_IMAGE_NS_BUF_SIZE)
PLAT_SP_IMAGE_NS_BUF_SIZE)
...
...
plat/arm/common/aarch64/arm_sdei.c
View file @
4108abb4
/*
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017
-2020
, ARM Limited and Contributors. All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-License-Identifier: BSD-3-Clause
*/
*/
/* SDEI configuration for ARM platforms */
/* SDEI configuration for ARM platforms */
#include <platform_def.h>
#include <bl31/ehf.h>
#include <bl31/ehf.h>
#include <common/debug.h>
#include <services/sdei.h>
#include <services/sdei.h>
#if SDEI_IN_FCONF
#include <plat/arm/common/fconf_sdei_getter.h>
#endif
#include <plat/common/platform.h>
#include <platform_def.h>
#if SDEI_IN_FCONF
/* Private event mappings */
static
sdei_ev_map_t
arm_sdei_private
[
PLAT_SDEI_DP_EVENT_MAX_CNT
+
1
]
=
{
0
};
/* Shared event mappings */
static
sdei_ev_map_t
arm_sdei_shared
[
PLAT_SDEI_DS_EVENT_MAX_CNT
]
=
{
0
};
void
plat_sdei_setup
(
void
)
{
uint32_t
i
;
arm_sdei_private
[
0
]
=
(
sdei_ev_map_t
)
SDEI_DEFINE_EVENT_0
(
ARM_SDEI_SGI
);
for
(
i
=
0
;
i
<
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
private_ev_cnt
);
i
++
)
{
arm_sdei_private
[
i
+
1
]
=
(
sdei_ev_map_t
)
SDEI_PRIVATE_EVENT
(
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
private_ev_nums
[
i
]),
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
private_ev_intrs
[
i
]),
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
private_ev_flags
[
i
]));
}
for
(
i
=
0
;
i
<
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
shared_ev_cnt
);
i
++
)
{
arm_sdei_shared
[
i
]
=
(
sdei_ev_map_t
)
SDEI_SHARED_EVENT
(
\
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
shared_ev_nums
[
i
]),
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
shared_ev_intrs
[
i
]),
FCONF_GET_PROPERTY
(
sdei
,
dyn_config
,
shared_ev_flags
[
i
]));
}
INFO
(
"FCONF: SDEI platform setup
\n
"
);
}
#else
/* Private event mappings */
/* Private event mappings */
static
sdei_ev_map_t
arm_sdei_private
[]
=
{
static
sdei_ev_map_t
arm_sdei_private
[]
=
{
PLAT_ARM_PRIVATE_SDEI_EVENTS
PLAT_ARM_PRIVATE_SDEI_EVENTS
...
@@ -21,5 +56,11 @@ static sdei_ev_map_t arm_sdei_shared[] = {
...
@@ -21,5 +56,11 @@ static sdei_ev_map_t arm_sdei_shared[] = {
PLAT_ARM_SHARED_SDEI_EVENTS
PLAT_ARM_SHARED_SDEI_EVENTS
};
};
void
plat_sdei_setup
(
void
)
{
INFO
(
"SDEI platform setup
\n
"
);
}
#endif
/* SDEI_IN_FCONF */
/* Export ARM SDEI events */
/* Export ARM SDEI events */
REGISTER_SDEI_MAP
(
arm_sdei_private
,
arm_sdei_shared
);
REGISTER_SDEI_MAP
(
arm_sdei_private
,
arm_sdei_shared
);
plat/arm/common/arm_common.mk
View file @
4108abb4
...
@@ -263,6 +263,9 @@ endif
...
@@ -263,6 +263,9 @@ endif
ifeq
(${SDEI_SUPPORT},1)
ifeq
(${SDEI_SUPPORT},1)
BL31_SOURCES
+=
plat/arm/common/aarch64/arm_sdei.c
BL31_SOURCES
+=
plat/arm/common/aarch64/arm_sdei.c
ifeq
(${SDEI_IN_FCONF},1)
BL31_SOURCES
+=
plat/arm/common/fconf/fconf_sdei_getter.c
endif
endif
endif
# RAS sources
# RAS sources
...
...
plat/arm/common/fconf/fconf_sdei_getter.c
0 → 100644
View file @
4108abb4
/*
* Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <common/debug.h>
#include <common/fdt_wrappers.h>
#include <libfdt.h>
#include <plat/arm/common/fconf_sdei_getter.h>
#define PRIVATE_EVENT_NUM(i) private_events[3 * (i)]
#define PRIVATE_EVENT_INTR(i) private_events[3 * (i) + 1]
#define PRIVATE_EVENT_FLAGS(i) private_events[3 * (i) + 2]
#define SHARED_EVENT_NUM(i) shared_events[3 * (i)]
#define SHARED_EVENT_INTR(i) shared_events[3 * (i) + 1]
#define SHARED_EVENT_FLAGS(i) shared_events[3 * (i) + 2]
struct
sdei_dyn_config_t
sdei_dyn_config
;
int
fconf_populate_sdei_dyn_config
(
uintptr_t
config
)
{
uint32_t
i
;
int
node
,
err
;
uint32_t
private_events
[
PLAT_SDEI_DP_EVENT_MAX_CNT
*
3
];
uint32_t
shared_events
[
PLAT_SDEI_DS_EVENT_MAX_CNT
*
3
];
const
void
*
dtb
=
(
void
*
)
config
;
/* Check that the node offset points to compatible property */
node
=
fdt_node_offset_by_compatible
(
dtb
,
-
1
,
"arm,sdei-1.0"
);
if
(
node
<
0
)
{
ERROR
(
"FCONF: Can't find 'arm,sdei-1.0' compatible node in dtb
\n
"
);
return
node
;
}
/* Read number of private mappings */
err
=
fdt_read_uint32
(
dtb
,
node
,
"private_event_count"
,
&
sdei_dyn_config
.
private_ev_cnt
);
if
(
err
<
0
)
{
ERROR
(
"FCONF: Read cell failed for 'private_event_count': %u
\n
"
,
sdei_dyn_config
.
private_ev_cnt
);
return
err
;
}
/* Check if the value is in range */
if
(
sdei_dyn_config
.
private_ev_cnt
>
PLAT_SDEI_DP_EVENT_MAX_CNT
)
{
ERROR
(
"FCONF: Invalid value for 'private_event_count': %u
\n
"
,
sdei_dyn_config
.
private_ev_cnt
);
return
-
1
;
}
/* Read private mappings */
err
=
fdt_read_uint32_array
(
dtb
,
node
,
"private_events"
,
sdei_dyn_config
.
private_ev_cnt
*
3
,
private_events
);
if
(
err
<
0
)
{
ERROR
(
"FCONF: Read cell failed for 'private_events': %d
\n
"
,
err
);
return
err
;
}
/* Move data to fconf struct */
for
(
i
=
0
;
i
<
sdei_dyn_config
.
private_ev_cnt
;
i
++
)
{
sdei_dyn_config
.
private_ev_nums
[
i
]
=
PRIVATE_EVENT_NUM
(
i
);
sdei_dyn_config
.
private_ev_intrs
[
i
]
=
PRIVATE_EVENT_INTR
(
i
);
sdei_dyn_config
.
private_ev_flags
[
i
]
=
PRIVATE_EVENT_FLAGS
(
i
);
}
/* Read number of shared mappings */
err
=
fdt_read_uint32
(
dtb
,
node
,
"shared_event_count"
,
&
sdei_dyn_config
.
shared_ev_cnt
);
if
(
err
<
0
)
{
ERROR
(
"FCONF: Read cell failed for 'shared_event_count'
\n
"
);
return
err
;
}
/* Check if the value is in range */
if
(
sdei_dyn_config
.
shared_ev_cnt
>
PLAT_SDEI_DS_EVENT_MAX_CNT
)
{
ERROR
(
"FCONF: Invalid value for 'shared_event_count': %u
\n
"
,
sdei_dyn_config
.
shared_ev_cnt
);
return
-
1
;
}
/* Read shared mappings */
err
=
fdt_read_uint32_array
(
dtb
,
node
,
"shared_events"
,
sdei_dyn_config
.
shared_ev_cnt
*
3
,
shared_events
);
if
(
err
<
0
)
{
ERROR
(
"FCONF: Read cell failed for 'shared_events': %d
\n
"
,
err
);
return
err
;
}
/* Move data to fconf struct */
for
(
i
=
0
;
i
<
sdei_dyn_config
.
shared_ev_cnt
;
i
++
)
{
sdei_dyn_config
.
shared_ev_nums
[
i
]
=
SHARED_EVENT_NUM
(
i
);
sdei_dyn_config
.
shared_ev_intrs
[
i
]
=
SHARED_EVENT_INTR
(
i
);
sdei_dyn_config
.
shared_ev_flags
[
i
]
=
SHARED_EVENT_FLAGS
(
i
);
}
return
0
;
}
FCONF_REGISTER_POPULATOR
(
HW_CONFIG
,
sdei
,
fconf_populate_sdei_dyn_config
);
services/std_svc/sdei/sdei_main.c
View file @
4108abb4
/*
/*
* Copyright (c) 2017-20
18
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-20
20
, ARM Limited and Contributors. All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-License-Identifier: BSD-3-Clause
*/
*/
...
@@ -226,6 +226,7 @@ static void sdei_class_init(sdei_class_t class)
...
@@ -226,6 +226,7 @@ static void sdei_class_init(sdei_class_t class)
/* SDEI dispatcher initialisation */
/* SDEI dispatcher initialisation */
void
sdei_init
(
void
)
void
sdei_init
(
void
)
{
{
plat_sdei_setup
();
sdei_class_init
(
SDEI_CRITICAL
);
sdei_class_init
(
SDEI_CRITICAL
);
sdei_class_init
(
SDEI_NORMAL
);
sdei_class_init
(
SDEI_NORMAL
);
...
@@ -328,8 +329,11 @@ finish:
...
@@ -328,8 +329,11 @@ finish:
}
}
/* Register handler and argument for an SDEI event */
/* Register handler and argument for an SDEI event */
static
int64_t
sdei_event_register
(
int
ev_num
,
uint64_t
ep
,
uint64_t
arg
,
static
int64_t
sdei_event_register
(
int
ev_num
,
uint64_t
flags
,
uint64_t
mpidr
)
uint64_t
ep
,
uint64_t
arg
,
uint64_t
flags
,
uint64_t
mpidr
)
{
{
int
ret
;
int
ret
;
unsigned
int
routing
;
unsigned
int
routing
;
...
...
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