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
97f12332
Unverified
Commit
97f12332
authored
Oct 18, 2018
by
Soby Mathew
Committed by
GitHub
Oct 18, 2018
Browse files
Merge pull request #1629 from robertovargas-arm/hw-assisted-coherency-lock
Optimize bakery locks when HW_ASSISTED_COHERENCY is enabled
parents
1278f363
32aee841
Changes
5
Show whitespace changes
Inline
Side-by-side
bl31/bl31.ld.S
View file @
97f12332
...
...
@@ -188,8 +188,15 @@ SECTIONS
__PERCPU_BAKERY_LOCK_SIZE__
=
ABSOLUTE
(
.
-
__BAKERY_LOCK_START__
)
;
.
=
.
+
(
__PERCPU_BAKERY_LOCK_SIZE__
*
(
PLATFORM_CORE_COUNT
-
1
))
;
__BAKERY_LOCK_END__
=
.
;
/
*
*
If
BL31
doesn
't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__
*
will
be
zero
.
For
this
reason
,
the
only
two
valid
values
for
*
__PERCPU_BAKERY_LOCK_SIZE__
are
0
or
the
platform
defined
value
*
PLAT_PERCPU_BAKERY_LOCK_SIZE
.
*/
#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
ASSERT
(
__PERCPU_BAKERY_LOCK_SIZE__
==
PLAT_PERCPU_BAKERY_LOCK_SIZE
,
ASSERT
((
__PERCPU_BAKERY_LOCK_SIZE__
==
0
)
||
(
__PERCPU_BAKERY_LOCK_SIZE__
==
PLAT_PERCPU_BAKERY_LOCK_SIZE
)
,
"
PLAT_PERCPU_BAKERY_LOCK_SIZE
does
not
match
bakery
lock
requirements
");
#endif
#endif
...
...
include/plat/arm/common/plat_arm.h
View file @
97f12332
...
...
@@ -11,6 +11,7 @@
#include <cassert.h>
#include <cpu_data.h>
#include <stdint.h>
#include <spinlock.h>
#include <tzc_common.h>
#include <utils_def.h>
...
...
@@ -80,6 +81,14 @@ void arm_setup_romlib(void);
*/
#define ARM_INSTANTIATE_LOCK static DEFINE_BAKERY_LOCK(arm_lock)
#define ARM_LOCK_GET_INSTANCE (&arm_lock)
#if !HW_ASSISTED_COHERENCY
#define ARM_SCMI_INSTANTIATE_LOCK DEFINE_BAKERY_LOCK(arm_scmi_lock)
#else
#define ARM_SCMI_INSTANTIATE_LOCK spinlock_t arm_scmi_lock
#endif
#define ARM_SCMI_LOCK_GET_INSTANCE (&arm_scmi_lock)
/*
* These are wrapper macros to the Coherent Memory Bakery Lock API.
*/
...
...
plat/arm/css/drivers/scmi/scmi.h
View file @
97f12332
...
...
@@ -10,6 +10,7 @@
#include <bakery_lock.h>
#include <stddef.h>
#include <stdint.h>
#include <spinlock.h>
/* Supported SCMI Protocol Versions */
#define SCMI_AP_CORE_PROTO_VER MAKE_SCMI_VERSION(1, 0)
...
...
@@ -116,13 +117,20 @@ typedef struct scmi_channel_plat_info {
void
*
cookie
;
}
scmi_channel_plat_info_t
;
#if HW_ASSISTED_COHERENCY
typedef
spinlock_t
scmi_lock_t
;
#else
typedef
bakery_lock_t
scmi_lock_t
;
#endif
/*
* Structure to represent an SCMI channel.
*/
typedef
struct
scmi_channel
{
scmi_channel_plat_info_t
*
info
;
/* The lock for channel access */
bakery
_lock_t
*
lock
;
scmi
_lock_t
*
lock
;
/* Indicate whether the channel is initialized */
int
is_initialized
;
}
scmi_channel_t
;
...
...
plat/arm/css/drivers/scmi/scmi_common.c
View file @
97f12332
...
...
@@ -10,13 +10,25 @@
#include "scmi.h"
#include "scmi_private.h"
#if HW_ASSISTED_COHERENCY
#define scmi_lock_init(lock)
#define scmi_lock_get(lock) spin_lock(lock)
#define scmi_lock_release(lock) spin_unlock(lock)
#else
#define scmi_lock_init(lock) bakery_lock_init(lock)
#define scmi_lock_get(lock) bakery_lock_get(lock)
#define scmi_lock_release(lock) bakery_lock_release(lock)
#endif
/*
* Private helper function to get exclusive access to SCMI channel.
*/
void
scmi_get_channel
(
scmi_channel_t
*
ch
)
{
assert
(
ch
->
lock
);
bakery
_lock_get
(
ch
->
lock
);
scmi
_lock_get
(
ch
->
lock
);
/* Make sure any previous command has finished */
assert
(
SCMI_IS_CHANNEL_FREE
(
...
...
@@ -68,7 +80,7 @@ void scmi_put_channel(scmi_channel_t *ch)
((
mailbox_mem_t
*
)(
ch
->
info
->
scmi_mbx_mem
))
->
status
));
assert
(
ch
->
lock
);
bakery
_lock_release
(
ch
->
lock
);
scmi
_lock_release
(
ch
->
lock
);
}
/*
...
...
@@ -152,7 +164,7 @@ void *scmi_init(scmi_channel_t *ch)
assert
(
ch
->
lock
);
bakery
_lock_init
(
ch
->
lock
);
scmi
_lock_init
(
ch
->
lock
);
ch
->
is_initialized
=
1
;
...
...
plat/arm/css/drivers/scp/css_pm_scmi.c
View file @
97f12332
...
...
@@ -71,7 +71,7 @@ static void *scmi_handle;
/* The SCMI channel global object */
static
scmi_channel_t
channel
;
ARM_INSTANTIATE_LOCK
;
ARM_
SCMI_
INSTANTIATE_LOCK
;
/*
* Helper function to suspend a CPU power domain and its parent power domains
...
...
@@ -331,7 +331,7 @@ static int scmi_ap_core_init(scmi_channel_t *ch)
void
__init
plat_arm_pwrc_setup
(
void
)
{
channel
.
info
=
&
plat_css_scmi_plat_info
;
channel
.
lock
=
ARM_LOCK_GET_INSTANCE
;
channel
.
lock
=
ARM_
SCMI_
LOCK_GET_INSTANCE
;
scmi_handle
=
scmi_init
(
&
channel
);
if
(
scmi_handle
==
NULL
)
{
ERROR
(
"SCMI Initialization failed
\n
"
);
...
...
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