diff --git a/bl31/bl31.ld.S b/bl31/bl31.ld.S index 66cb3f3..81e7ba3 100644 --- a/bl31/bl31.ld.S +++ b/bl31/bl31.ld.S @@ -188,8 +188,15 @@ __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 diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index d543894..848f4ee 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -80,6 +81,14 @@ */ #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. */ diff --git a/plat/arm/css/drivers/scmi/scmi.h b/plat/arm/css/drivers/scmi/scmi.h index 723fd06..71a8c2d 100644 --- a/plat/arm/css/drivers/scmi/scmi.h +++ b/plat/arm/css/drivers/scmi/scmi.h @@ -10,6 +10,7 @@ #include #include #include +#include /* Supported SCMI Protocol Versions */ #define SCMI_AP_CORE_PROTO_VER MAKE_SCMI_VERSION(1, 0) @@ -116,13 +117,20 @@ 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; diff --git a/plat/arm/css/drivers/scmi/scmi_common.c b/plat/arm/css/drivers/scmi/scmi_common.c index 8482d21..b34178e 100644 --- a/plat/arm/css/drivers/scmi/scmi_common.c +++ b/plat/arm/css/drivers/scmi/scmi_common.c @@ -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 @@ ((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 @@ assert(ch->lock); - bakery_lock_init(ch->lock); + scmi_lock_init(ch->lock); ch->is_initialized = 1; diff --git a/plat/arm/css/drivers/scp/css_pm_scmi.c b/plat/arm/css/drivers/scp/css_pm_scmi.c index d280101..9297e9f 100644 --- a/plat/arm/css/drivers/scp/css_pm_scmi.c +++ b/plat/arm/css/drivers/scp/css_pm_scmi.c @@ -71,7 +71,7 @@ /* 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 @@ 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");