Unverified Commit 97f12332 authored by Soby Mathew's avatar Soby Mathew Committed by GitHub
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
...@@ -188,8 +188,15 @@ SECTIONS ...@@ -188,8 +188,15 @@ SECTIONS
__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(. - __BAKERY_LOCK_START__); __PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(. - __BAKERY_LOCK_START__);
. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); . = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1));
__BAKERY_LOCK_END__ = .; __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 #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"); "PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
#endif #endif
#endif #endif
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <cassert.h> #include <cassert.h>
#include <cpu_data.h> #include <cpu_data.h>
#include <stdint.h> #include <stdint.h>
#include <spinlock.h>
#include <tzc_common.h> #include <tzc_common.h>
#include <utils_def.h> #include <utils_def.h>
...@@ -80,6 +81,14 @@ void arm_setup_romlib(void); ...@@ -80,6 +81,14 @@ void arm_setup_romlib(void);
*/ */
#define ARM_INSTANTIATE_LOCK static DEFINE_BAKERY_LOCK(arm_lock) #define ARM_INSTANTIATE_LOCK static DEFINE_BAKERY_LOCK(arm_lock)
#define ARM_LOCK_GET_INSTANCE (&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. * These are wrapper macros to the Coherent Memory Bakery Lock API.
*/ */
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <bakery_lock.h> #include <bakery_lock.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <spinlock.h>
/* Supported SCMI Protocol Versions */ /* Supported SCMI Protocol Versions */
#define SCMI_AP_CORE_PROTO_VER MAKE_SCMI_VERSION(1, 0) #define SCMI_AP_CORE_PROTO_VER MAKE_SCMI_VERSION(1, 0)
...@@ -116,13 +117,20 @@ typedef struct scmi_channel_plat_info { ...@@ -116,13 +117,20 @@ typedef struct scmi_channel_plat_info {
void *cookie; void *cookie;
} scmi_channel_plat_info_t; } 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. * Structure to represent an SCMI channel.
*/ */
typedef struct scmi_channel { typedef struct scmi_channel {
scmi_channel_plat_info_t *info; scmi_channel_plat_info_t *info;
/* The lock for channel access */ /* The lock for channel access */
bakery_lock_t *lock; scmi_lock_t *lock;
/* Indicate whether the channel is initialized */ /* Indicate whether the channel is initialized */
int is_initialized; int is_initialized;
} scmi_channel_t; } scmi_channel_t;
......
...@@ -10,13 +10,25 @@ ...@@ -10,13 +10,25 @@
#include "scmi.h" #include "scmi.h"
#include "scmi_private.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. * Private helper function to get exclusive access to SCMI channel.
*/ */
void scmi_get_channel(scmi_channel_t *ch) void scmi_get_channel(scmi_channel_t *ch)
{ {
assert(ch->lock); assert(ch->lock);
bakery_lock_get(ch->lock); scmi_lock_get(ch->lock);
/* Make sure any previous command has finished */ /* Make sure any previous command has finished */
assert(SCMI_IS_CHANNEL_FREE( assert(SCMI_IS_CHANNEL_FREE(
...@@ -68,7 +80,7 @@ void scmi_put_channel(scmi_channel_t *ch) ...@@ -68,7 +80,7 @@ void scmi_put_channel(scmi_channel_t *ch)
((mailbox_mem_t *)(ch->info->scmi_mbx_mem))->status)); ((mailbox_mem_t *)(ch->info->scmi_mbx_mem))->status));
assert(ch->lock); assert(ch->lock);
bakery_lock_release(ch->lock); scmi_lock_release(ch->lock);
} }
/* /*
...@@ -152,7 +164,7 @@ void *scmi_init(scmi_channel_t *ch) ...@@ -152,7 +164,7 @@ void *scmi_init(scmi_channel_t *ch)
assert(ch->lock); assert(ch->lock);
bakery_lock_init(ch->lock); scmi_lock_init(ch->lock);
ch->is_initialized = 1; ch->is_initialized = 1;
......
...@@ -71,7 +71,7 @@ static void *scmi_handle; ...@@ -71,7 +71,7 @@ static void *scmi_handle;
/* The SCMI channel global object */ /* The SCMI channel global object */
static scmi_channel_t channel; 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 * 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) ...@@ -331,7 +331,7 @@ static int scmi_ap_core_init(scmi_channel_t *ch)
void __init plat_arm_pwrc_setup(void) void __init plat_arm_pwrc_setup(void)
{ {
channel.info = &plat_css_scmi_plat_info; 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); scmi_handle = scmi_init(&channel);
if (scmi_handle == NULL) { if (scmi_handle == NULL) {
ERROR("SCMI Initialization failed\n"); ERROR("SCMI Initialization failed\n");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment