diff options
Diffstat (limited to 'plat')
| -rw-r--r-- | plat/fvp/drivers/pwrc/fvp_pwrc.c | 33 | ||||
| -rw-r--r-- | plat/fvp/fvp_private.h | 57 | ||||
| -rw-r--r-- | plat/fvp/include/platform_def.h | 7 | ||||
| -rw-r--r-- | plat/juno/include/platform_def.h | 8 | ||||
| -rw-r--r-- | plat/juno/juno_private.h | 64 | ||||
| -rw-r--r-- | plat/juno/mhu.c | 18 | ||||
| -rw-r--r-- | plat/juno/platform.mk | 1 | 
7 files changed, 167 insertions, 21 deletions
| diff --git a/plat/fvp/drivers/pwrc/fvp_pwrc.c b/plat/fvp/drivers/pwrc/fvp_pwrc.c index c32c322b..0497c2b8 100644 --- a/plat/fvp/drivers/pwrc/fvp_pwrc.c +++ b/plat/fvp/drivers/pwrc/fvp_pwrc.c @@ -31,13 +31,19 @@  #include <bakery_lock.h>  #include <mmio.h>  #include "../../fvp_def.h" +#include "../../fvp_private.h"  #include "fvp_pwrc.h"  /*   * TODO: Someday there will be a generic power controller api. At the moment   * each platform has its own pwrc so just exporting functions is fine.   */ +#if USE_COHERENT_MEM  static bakery_lock_t pwrc_lock __attribute__ ((section("tzfw_coherent_mem"))); +#define LOCK_ARG	&pwrc_lock +#else +#define LOCK_ARG	FVP_PWRC_BAKERY_ID +#endif  unsigned int fvp_pwrc_get_cpu_wkr(unsigned long mpidr)  { @@ -47,54 +53,55 @@ unsigned int fvp_pwrc_get_cpu_wkr(unsigned long mpidr)  unsigned int fvp_pwrc_read_psysr(unsigned long mpidr)  {  	unsigned int rc; -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr);  	rc = mmio_read_32(PWRC_BASE + PSYSR_OFF); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  	return rc;  }  void fvp_pwrc_write_pponr(unsigned long mpidr)  { -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  }  void fvp_pwrc_write_ppoffr(unsigned long mpidr)  { -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  }  void fvp_pwrc_set_wen(unsigned long mpidr)  { -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PWKUPR_OFF,  		      (unsigned int) (PWKUPR_WEN | mpidr)); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  }  void fvp_pwrc_clr_wen(unsigned long mpidr)  { -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PWKUPR_OFF,  		      (unsigned int) mpidr); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  }  void fvp_pwrc_write_pcoffr(unsigned long mpidr)  { -	bakery_lock_get(&pwrc_lock); +	fvp_lock_get(LOCK_ARG);  	mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr); -	bakery_lock_release(&pwrc_lock); +	fvp_lock_release(LOCK_ARG);  }  /* Nothing else to do here apart from initializing the lock */  int fvp_pwrc_setup(void)  { -	bakery_lock_init(&pwrc_lock); +	fvp_lock_init(LOCK_ARG); +  	return 0;  } diff --git a/plat/fvp/fvp_private.h b/plat/fvp/fvp_private.h index 2dcb327f..6f1a637e 100644 --- a/plat/fvp/fvp_private.h +++ b/plat/fvp/fvp_private.h @@ -31,7 +31,9 @@  #ifndef __FVP_PRIVATE_H__  #define __FVP_PRIVATE_H__ +#include <bakery_lock.h>  #include <bl_common.h> +#include <cpu_data.h>  #include <platform_def.h> @@ -55,10 +57,60 @@ typedef struct bl2_to_bl31_params_mem {  	entry_point_info_t bl31_ep_info;  } bl2_to_bl31_params_mem_t; +#if USE_COHERENT_MEM +/* + * These are wrapper macros to the Coherent Memory Bakery Lock API. + */ +#define fvp_lock_init(_lock_arg)	bakery_lock_init(_lock_arg) +#define fvp_lock_get(_lock_arg)		bakery_lock_get(_lock_arg) +#define fvp_lock_release(_lock_arg)	bakery_lock_release(_lock_arg) + +#else +  /******************************************************************************* - * Forward declarations + * Constants to specify how many bakery locks this platform implements. These + * are used if the platform chooses not to use coherent memory for bakery lock + * data structures.   ******************************************************************************/ -struct meminfo; +#define FVP_MAX_BAKERIES	1 +#define FVP_PWRC_BAKERY_ID	0 + +/******************************************************************************* + * Definition of structure which holds platform specific per-cpu data. Currently + * it holds only the bakery lock information for each cpu. Constants to + * specify how many bakeries this platform implements and bakery ids are + * specified in fvp_def.h + ******************************************************************************/ +typedef struct fvp_cpu_data { +	bakery_info_t pcpu_bakery_info[FVP_MAX_BAKERIES]; +} fvp_cpu_data_t; + +/* Macro to define the offset of bakery_info_t in fvp_cpu_data_t */ +#define FVP_CPU_DATA_LOCK_OFFSET	__builtin_offsetof\ +					    (fvp_cpu_data_t, pcpu_bakery_info) + + +/******************************************************************************* + * Helper macros for bakery lock api when using the above fvp_cpu_data_t for + * bakery lock data structures. It assumes that the bakery_info is at the + * beginning of the platform specific per-cpu data. + ******************************************************************************/ +#define fvp_lock_init(_lock_arg)	/* No init required */ +#define fvp_lock_get(_lock_arg)		bakery_lock_get(_lock_arg,  	    \ +						CPU_DATA_PLAT_PCPU_OFFSET + \ +						FVP_CPU_DATA_LOCK_OFFSET) +#define fvp_lock_release(_lock_arg)	bakery_lock_release(_lock_arg,	    \ +						CPU_DATA_PLAT_PCPU_OFFSET + \ +						FVP_CPU_DATA_LOCK_OFFSET) + +/* + * Ensure that the size of the FVP specific per-cpu data structure and the size + * of the memory allocated in generic per-cpu data for the platform are the same. + */ +CASSERT(PLAT_PCPU_DATA_SIZE == sizeof(fvp_cpu_data_t),	\ +	fvp_pcpu_data_size_mismatch); + +#endif /* __USE_COHERENT_MEM__ */  /*******************************************************************************   * Function and variable prototypes @@ -75,6 +127,7 @@ void fvp_configure_mmu_el3(unsigned long total_base,  			   unsigned long,  			   unsigned long,  			   unsigned long); +  int fvp_config_setup(void);  void fvp_cci_init(void); diff --git a/plat/fvp/include/platform_def.h b/plat/fvp/include/platform_def.h index 5364a3da..e3c48e67 100644 --- a/plat/fvp/include/platform_def.h +++ b/plat/fvp/include/platform_def.h @@ -169,5 +169,12 @@  #define CACHE_WRITEBACK_SHIFT   6  #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) +#if !USE_COHERENT_MEM +/******************************************************************************* + * Size of the per-cpu data in bytes that should be reserved in the generic + * per-cpu data structure for the FVP port. + ******************************************************************************/ +#define PLAT_PCPU_DATA_SIZE	2 +#endif  #endif /* __PLATFORM_DEF_H__ */ diff --git a/plat/juno/include/platform_def.h b/plat/juno/include/platform_def.h index ee77b832..cd077021 100644 --- a/plat/juno/include/platform_def.h +++ b/plat/juno/include/platform_def.h @@ -174,4 +174,12 @@  #define CACHE_WRITEBACK_SHIFT   6  #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) +#if !USE_COHERENT_MEM +/******************************************************************************* + * Size of the per-cpu data in bytes that should be reserved in the generic + * per-cpu data structure for the Juno port. + ******************************************************************************/ +#define PLAT_PCPU_DATA_SIZE	2 +#endif +  #endif /* __PLATFORM_DEF_H__ */ diff --git a/plat/juno/juno_private.h b/plat/juno/juno_private.h index 14d7af4d..b7ef4488 100644 --- a/plat/juno/juno_private.h +++ b/plat/juno/juno_private.h @@ -31,7 +31,9 @@  #ifndef __JUNO_PRIVATE_H__  #define __JUNO_PRIVATE_H__ +#include <bakery_lock.h>  #include <bl_common.h> +#include <cpu_data.h>  #include <platform_def.h>  #include <stdint.h> @@ -59,6 +61,68 @@ typedef struct bl2_to_bl31_params_mem {  	struct entry_point_info bl31_ep_info;  } bl2_to_bl31_params_mem_t; +#if IMAGE_BL31 +#if USE_COHERENT_MEM +/* + * These are wrapper macros to the Coherent Memory Bakery Lock API. + */ +#define juno_lock_init(_lock_arg)		bakery_lock_init(_lock_arg) +#define juno_lock_get(_lock_arg)		bakery_lock_get(_lock_arg) +#define juno_lock_release(_lock_arg)		bakery_lock_release(_lock_arg) + +#else + +/******************************************************************************* + * Constants that specify how many bakeries this platform implements and bakery + * ids. + ******************************************************************************/ +#define JUNO_MAX_BAKERIES	1 +#define JUNO_MHU_BAKERY_ID	0 + +/******************************************************************************* + * Definition of structure which holds platform specific per-cpu data. Currently + * it holds only the bakery lock information for each cpu. Constants to specify + * how many bakeries this platform implements and bakery ids are specified in + * juno_def.h + ******************************************************************************/ +typedef struct juno_cpu_data { +	bakery_info_t pcpu_bakery_info[JUNO_MAX_BAKERIES]; +} juno_cpu_data_t; + +/* Macro to define the offset of bakery_info_t in juno_cpu_data_t */ +#define JUNO_CPU_DATA_LOCK_OFFSET	__builtin_offsetof\ +					    (juno_cpu_data_t, pcpu_bakery_info) + +/******************************************************************************* + * Helper macros for bakery lock api when using the above juno_cpu_data_t for + * bakery lock data structures. It assumes that the bakery_info is at the + * beginning of the platform specific per-cpu data. + ******************************************************************************/ +#define juno_lock_init(_lock_arg)		/* No init required */ +#define juno_lock_get(_lock_arg)		bakery_lock_get(_lock_arg,	\ +						    CPU_DATA_PLAT_PCPU_OFFSET + \ +						    JUNO_CPU_DATA_LOCK_OFFSET) +#define juno_lock_release(_lock_arg)		bakery_lock_release(_lock_arg,	\ +						    CPU_DATA_PLAT_PCPU_OFFSET + \ +						    JUNO_CPU_DATA_LOCK_OFFSET) + +/* + * Ensure that the size of the Juno specific per-cpu data structure and the size + * of the memory allocated in generic per-cpu data for the platform are the same. + */ +CASSERT(PLAT_PCPU_DATA_SIZE == sizeof(juno_cpu_data_t),	\ +	juno_pcpu_data_size_mismatch); +#endif /* __USE_COHERENT_MEM__ */ +#else +/* + * Dummy wrapper macros for all other BL stages other than BL3-1 + */ +#define juno_lock_init(_lock_arg) +#define juno_lock_get(_lock_arg) +#define juno_lock_release(_lock_arg) + +#endif /* __IMAGE_BL31__ */ +  /*******************************************************************************   * Function and variable prototypes   ******************************************************************************/ diff --git a/plat/juno/mhu.c b/plat/juno/mhu.c index b6541a88..c1c414c2 100644 --- a/plat/juno/mhu.c +++ b/plat/juno/mhu.c @@ -32,6 +32,7 @@  #include <bakery_lock.h>  #include <mmio.h>  #include "juno_def.h" +#include "juno_private.h"  #include "mhu.h"  /* SCP MHU secure channel registers */ @@ -44,13 +45,20 @@  #define CPU_INTR_S_SET		0x308  #define CPU_INTR_S_CLEAR	0x310 - +#if IMAGE_BL31 +#if USE_COHERENT_MEM  static bakery_lock_t mhu_secure_lock __attribute__ ((section("tzfw_coherent_mem"))); - +#define LOCK_ARG		&mhu_secure_lock +#else +#define LOCK_ARG		JUNO_MHU_BAKERY_ID +#endif /*__USE_COHERENT_MEM__ */ +#else +#define LOCK_ARG	/* Locks required only for BL3-1 images */ +#endif /* __IMAGE_BL31__ */  void mhu_secure_message_start(void)  { -	bakery_lock_get(&mhu_secure_lock); +	juno_lock_get(LOCK_ARG);  	/* Make sure any previous command has finished */  	while (mmio_read_32(MHU_BASE + CPU_INTR_S_STAT) != 0) @@ -80,12 +88,12 @@ void mhu_secure_message_end(void)  	/* Clear any response we got by writing all ones to the CLEAR register */  	mmio_write_32(MHU_BASE + SCP_INTR_S_CLEAR, 0xffffffffu); -	bakery_lock_release(&mhu_secure_lock); +	juno_lock_release(LOCK_ARG);  }  void mhu_secure_init(void)  { -	bakery_lock_init(&mhu_secure_lock); +	juno_lock_init(LOCK_ARG);  	/*  	 * Clear the CPU's INTR register to make sure we don't see a stale diff --git a/plat/juno/platform.mk b/plat/juno/platform.mk index 6ca219d9..158e3ace 100644 --- a/plat/juno/platform.mk +++ b/plat/juno/platform.mk @@ -66,7 +66,6 @@ BL1_SOURCES		+=	drivers/arm/cci400/cci400.c		\  				plat/juno/aarch64/juno_common.c  BL2_SOURCES		+=	drivers/arm/tzc400/tzc400.c		\ -				lib/locks/bakery/bakery_lock.c		\  				plat/common/aarch64/platform_up_stack.S	\  				plat/juno/bl2_plat_setup.c		\  				plat/juno/mhu.c				\ | 
