diff options
Diffstat (limited to 'arch/arm/mach-omap2')
| -rw-r--r-- | arch/arm/mach-omap2/Kconfig | 12 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-secure.h | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-smp.c | 48 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/powerdomain.c | 9 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/powerdomains7xx_data.c | 76 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/timer.c | 7 | 
6 files changed, 68 insertions, 85 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 0517f0c1581a..1a648e9dfaa0 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -17,6 +17,7 @@ config ARCH_OMAP3  	select PM_OPP if PM  	select PM if CPU_IDLE  	select SOC_HAS_OMAP2_SDRC +	select ARM_ERRATA_430973  config ARCH_OMAP4  	bool "TI OMAP4" @@ -36,6 +37,7 @@ config ARCH_OMAP4  	select PM if CPU_IDLE  	select ARM_ERRATA_754322  	select ARM_ERRATA_775420 +	select OMAP_INTERCONNECT  config SOC_OMAP5  	bool "TI OMAP5" @@ -67,6 +69,8 @@ config SOC_AM43XX  	select HAVE_ARM_SCU  	select GENERIC_CLOCKEVENTS_BROADCAST  	select HAVE_ARM_TWD +	select ARM_ERRATA_754322 +	select ARM_ERRATA_775420  config SOC_DRA7XX  	bool "TI DRA7XX" @@ -240,4 +244,12 @@ endmenu  endif +config OMAP5_ERRATA_801819 +	bool "Errata 801819: An eviction from L1 data cache might stall indefinitely" +	depends on SOC_OMAP5 || SOC_DRA7XX +	help +	  A livelock can occur in the L2 cache arbitration that might prevent +	  a snoop from completing. Under certain conditions this can cause the +	  system to deadlock. +  endmenu diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h index af2851fbcdf0..bae263fba640 100644 --- a/arch/arm/mach-omap2/omap-secure.h +++ b/arch/arm/mach-omap2/omap-secure.h @@ -46,6 +46,7 @@  #define OMAP5_DRA7_MON_SET_CNTFRQ_INDEX	0x109  #define OMAP5_MON_AMBA_IF_INDEX		0x108 +#define OMAP5_DRA7_MON_SET_ACR_INDEX	0x107  /* Secure PPA(Primary Protected Application) APIs */  #define OMAP4_PPA_L2_POR_INDEX		0x23 diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index c625cc10d9f9..8cd1de914ee4 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c @@ -50,6 +50,39 @@ void __iomem *omap4_get_scu_base(void)  	return scu_base;  } +#ifdef CONFIG_OMAP5_ERRATA_801819 +void omap5_erratum_workaround_801819(void) +{ +	u32 acr, revidr; +	u32 acr_mask; + +	/* REVIDR[3] indicates erratum fix available on silicon */ +	asm volatile ("mrc p15, 0, %0, c0, c0, 6" : "=r" (revidr)); +	if (revidr & (0x1 << 3)) +		return; + +	asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr)); +	/* +	 * BIT(27) - Disables streaming. All write-allocate lines allocate in +	 * the L1 or L2 cache. +	 * BIT(25) - Disables streaming. All write-allocate lines allocate in +	 * the L1 cache. +	 */ +	acr_mask = (0x3 << 25) | (0x3 << 27); +	/* do we already have it done.. if yes, skip expensive smc */ +	if ((acr & acr_mask) == acr_mask) +		return; + +	acr |= acr_mask; +	omap_smc1(OMAP5_DRA7_MON_SET_ACR_INDEX, acr); + +	pr_debug("%s: ARM erratum workaround 801819 applied on CPU%d\n", +		 __func__, smp_processor_id()); +} +#else +static inline void omap5_erratum_workaround_801819(void) { } +#endif +  static void omap4_secondary_init(unsigned int cpu)  {  	/* @@ -64,12 +97,15 @@ static void omap4_secondary_init(unsigned int cpu)  		omap_secure_dispatcher(OMAP4_PPA_CPU_ACTRL_SMP_INDEX,  							4, 0, 0, 0, 0, 0); -	/* -	 * Configure the CNTFRQ register for the secondary cpu's which -	 * indicates the frequency of the cpu local timers. -	 */ -	if (soc_is_omap54xx() || soc_is_dra7xx()) +	if (soc_is_omap54xx() || soc_is_dra7xx()) { +		/* +		 * Configure the CNTFRQ register for the secondary cpu's which +		 * indicates the frequency of the cpu local timers. +		 */  		set_cntfreq(); +		/* Configure ACR to disable streaming WA for 801819 */ +		omap5_erratum_workaround_801819(); +	}  	/*  	 * Synchronise with the boot thread. @@ -218,6 +254,8 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)  	if (cpu_is_omap446x())  		startup_addr = omap4460_secondary_startup; +	if (soc_is_dra74x() || soc_is_omap54xx()) +		omap5_erratum_workaround_801819();  	/*  	 * Write the address of secondary startup routine into the diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 78af6d8cf2e2..daf2753de7aa 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -186,8 +186,9 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)  			trace_state = (PWRDM_TRACE_STATES_FLAG |  				       ((next & OMAP_POWERSTATE_MASK) << 8) |  				       ((prev & OMAP_POWERSTATE_MASK) << 0)); -			trace_power_domain_target(pwrdm->name, trace_state, -						  smp_processor_id()); +			trace_power_domain_target_rcuidle(pwrdm->name, +							  trace_state, +							  smp_processor_id());  		}  		break;  	default: @@ -523,8 +524,8 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)  	if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {  		/* Trace the pwrdm desired target state */ -		trace_power_domain_target(pwrdm->name, pwrst, -					  smp_processor_id()); +		trace_power_domain_target_rcuidle(pwrdm->name, pwrst, +						  smp_processor_id());  		/* Program the pwrdm desired target state */  		ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);  	} diff --git a/arch/arm/mach-omap2/powerdomains7xx_data.c b/arch/arm/mach-omap2/powerdomains7xx_data.c index 0ec2d00f4237..eb350a673133 100644 --- a/arch/arm/mach-omap2/powerdomains7xx_data.c +++ b/arch/arm/mach-omap2/powerdomains7xx_data.c @@ -36,14 +36,7 @@ static struct powerdomain iva_7xx_pwrdm = {  	.prcm_offs	  = DRA7XX_PRM_IVA_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON, -	.pwrsts_logic_ret = PWRSTS_OFF,  	.banks		  = 4, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* hwa_mem */ -		[1] = PWRSTS_OFF_RET,	/* sl2_mem */ -		[2] = PWRSTS_OFF_RET,	/* tcm1_mem */ -		[3] = PWRSTS_OFF_RET,	/* tcm2_mem */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* hwa_mem */  		[1] = PWRSTS_ON,	/* sl2_mem */ @@ -76,12 +69,7 @@ static struct powerdomain ipu_7xx_pwrdm = {  	.prcm_offs	  = DRA7XX_PRM_IPU_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON, -	.pwrsts_logic_ret = PWRSTS_OFF,  	.banks		  = 2, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* aessmem */ -		[1] = PWRSTS_OFF_RET,	/* periphmem */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* aessmem */  		[1] = PWRSTS_ON,	/* periphmem */ @@ -95,11 +83,7 @@ static struct powerdomain dss_7xx_pwrdm = {  	.prcm_offs	  = DRA7XX_PRM_DSS_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON, -	.pwrsts_logic_ret = PWRSTS_OFF,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* dss_mem */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* dss_mem */  	}, @@ -111,13 +95,8 @@ static struct powerdomain l4per_7xx_pwrdm = {  	.name		  = "l4per_pwrdm",  	.prcm_offs	  = DRA7XX_PRM_L4PER_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION, -	.pwrsts		  = PWRSTS_RET_ON, -	.pwrsts_logic_ret = PWRSTS_RET, +	.pwrsts		  = PWRSTS_ON,  	.banks		  = 2, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* nonretained_bank */ -		[1] = PWRSTS_OFF_RET,	/* retained_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* nonretained_bank */  		[1] = PWRSTS_ON,	/* retained_bank */ @@ -132,9 +111,6 @@ static struct powerdomain gpu_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* gpu_mem */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* gpu_mem */  	}, @@ -148,8 +124,6 @@ static struct powerdomain wkupaon_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* wkup_bank */  	}, @@ -161,15 +135,7 @@ static struct powerdomain core_7xx_pwrdm = {  	.prcm_offs	  = DRA7XX_PRM_CORE_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_ON, -	.pwrsts_logic_ret = PWRSTS_RET,  	.banks		  = 5, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* core_nret_bank */ -		[1] = PWRSTS_OFF_RET,	/* core_ocmram */ -		[2] = PWRSTS_OFF_RET,	/* core_other_bank */ -		[3] = PWRSTS_OFF_RET,	/* ipu_l2ram */ -		[4] = PWRSTS_OFF_RET,	/* ipu_unicache */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* core_nret_bank */  		[1] = PWRSTS_ON,	/* core_ocmram */ @@ -226,11 +192,7 @@ static struct powerdomain vpe_7xx_pwrdm = {  	.prcm_offs	  = DRA7XX_PRM_VPE_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON, -	.pwrsts_logic_ret = PWRSTS_OFF,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* vpe_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* vpe_bank */  	}, @@ -260,14 +222,8 @@ static struct powerdomain l3init_7xx_pwrdm = {  	.name		  = "l3init_pwrdm",  	.prcm_offs	  = DRA7XX_PRM_L3INIT_INST,  	.prcm_partition	  = DRA7XX_PRM_PARTITION, -	.pwrsts		  = PWRSTS_RET_ON, -	.pwrsts_logic_ret = PWRSTS_RET, +	.pwrsts		  = PWRSTS_ON,  	.banks		  = 3, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* gmac_bank */ -		[1] = PWRSTS_OFF_RET,	/* l3init_bank1 */ -		[2] = PWRSTS_OFF_RET,	/* l3init_bank2 */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* gmac_bank */  		[1] = PWRSTS_ON,	/* l3init_bank1 */ @@ -283,9 +239,6 @@ static struct powerdomain eve3_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* eve3_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* eve3_bank */  	}, @@ -299,9 +252,6 @@ static struct powerdomain emu_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* emu_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* emu_bank */  	}, @@ -314,11 +264,6 @@ static struct powerdomain dsp2_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 3, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* dsp2_edma */ -		[1] = PWRSTS_OFF_RET,	/* dsp2_l1 */ -		[2] = PWRSTS_OFF_RET,	/* dsp2_l2 */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* dsp2_edma */  		[1] = PWRSTS_ON,	/* dsp2_l1 */ @@ -334,11 +279,6 @@ static struct powerdomain dsp1_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 3, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* dsp1_edma */ -		[1] = PWRSTS_OFF_RET,	/* dsp1_l1 */ -		[2] = PWRSTS_OFF_RET,	/* dsp1_l2 */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* dsp1_edma */  		[1] = PWRSTS_ON,	/* dsp1_l1 */ @@ -354,9 +294,6 @@ static struct powerdomain cam_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* vip_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* vip_bank */  	}, @@ -370,9 +307,6 @@ static struct powerdomain eve4_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* eve4_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* eve4_bank */  	}, @@ -386,9 +320,6 @@ static struct powerdomain eve2_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* eve2_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* eve2_bank */  	}, @@ -402,9 +333,6 @@ static struct powerdomain eve1_7xx_pwrdm = {  	.prcm_partition	  = DRA7XX_PRM_PARTITION,  	.pwrsts		  = PWRSTS_OFF_ON,  	.banks		  = 1, -	.pwrsts_mem_ret	= { -		[0] = PWRSTS_OFF_RET,	/* eve1_bank */ -	},  	.pwrsts_mem_on	= {  		[0] = PWRSTS_ON,	/* eve1_bank */  	}, diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 5b385bb8aff9..cb9497a20fb3 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -496,8 +496,7 @@ void __init omap_init_time(void)  	__omap_sync32k_timer_init(1, "timer_32k_ck", "ti,timer-alwon",  			2, "timer_sys_ck", NULL, false); -	if (of_have_populated_dt()) -		clocksource_probe(); +	clocksource_probe();  }  #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM43XX) @@ -505,6 +504,8 @@ void __init omap3_secure_sync32k_timer_init(void)  {  	__omap_sync32k_timer_init(12, "secure_32k_fck", "ti,timer-secure",  			2, "timer_sys_ck", NULL, false); + +	clocksource_probe();  }  #endif /* CONFIG_ARCH_OMAP3 */ @@ -513,6 +514,8 @@ void __init omap3_gptimer_timer_init(void)  {  	__omap_sync32k_timer_init(2, "timer_sys_ck", NULL,  			1, "timer_sys_ck", "ti,timer-alwon", true); + +	clocksource_probe();  }  #endif  | 
