diff options
Diffstat (limited to 'arch/powerpc/cpu')
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/cpu_init.c | 50 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/fdt.c | 14 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/release.S | 14 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/start.S | 37 | 
4 files changed, 104 insertions, 11 deletions
| diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c index ba558dedd..e82c9517f 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c @@ -295,6 +295,43 @@ static void __fsl_serdes__init(void)  }  __attribute__((weak, alias("__fsl_serdes__init"))) void fsl_serdes_init(void); +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +int enable_cluster_l2(void) +{ +	int i = 0; +	u32 cluster; +	ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); +	struct ccsr_cluster_l2 __iomem *l2cache; + +	cluster = in_be32(&gur->tp_cluster[i].lower); +	if (cluster & TP_CLUSTER_EOC) +		return 0; + +	/* The first cache has already been set up, so skip it */ +	i++; + +	/* Look through the remaining clusters, and set up their caches */ +	do { +		l2cache = (void __iomem *)(CONFIG_SYS_FSL_CLUSTER_1_L2 + i * 0x40000); +		cluster = in_be32(&gur->tp_cluster[i].lower); + +		/* set stash ID to (cluster) * 2 + 32 + 1 */ +		clrsetbits_be32(&l2cache->l2csr1, 0xff, 32 + i * 2 + 1); + +		printf("enable l2 for cluster %d %p\n", i, l2cache); + +		out_be32(&l2cache->l2csr0, L2CSR0_L2FI|L2CSR0_L2LFC); +		while ((in_be32(&l2cache->l2csr0) & +			(L2CSR0_L2FI|L2CSR0_L2LFC)) != 0) +			; +		out_be32(&l2cache->l2csr0, L2CSR0_L2E); +		i++; +	} while (!(cluster & TP_CLUSTER_EOC)); + +	return 0; +} +#endif +  /*   * Initialize L2 as cache.   * @@ -306,7 +343,12 @@ int cpu_init_r(void)  {  	__maybe_unused u32 svr = get_svr();  #ifdef CONFIG_SYS_LBC_LCRR -	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; +	fsl_lbc_t *lbc = (void __iomem *)LBC_BASE_ADDR; +#endif +#ifdef CONFIG_L2_CACHE +	ccsr_l2cache_t *l2cache = (void __iomem *)CONFIG_SYS_MPC85xx_L2_ADDR; +#elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) +	struct ccsr_cluster_l2 * l2cache = (void __iomem *)CONFIG_SYS_FSL_CLUSTER_1_L2;  #endif  #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \ @@ -356,7 +398,6 @@ int cpu_init_r(void)  	puts ("L2:    ");  #if defined(CONFIG_L2_CACHE) -	volatile ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR;  	volatile uint cache_ctl;  	uint ver;  	u32 l2siz_field; @@ -467,6 +508,11 @@ int cpu_init_r(void)  	}  skip_l2: +#elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) +	if (l2cache->l2csr0 & L2CSR0_L2E) +		printf("%d KB enabled\n", (l2cache->l2cfg0 & 0x3fff) * 64); + +	enable_cluster_l2();  #else  	puts("disabled\n");  #endif diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c index a0a9b4c5a..d54527aa4 100644 --- a/arch/powerpc/cpu/mpc85xx/fdt.c +++ b/arch/powerpc/cpu/mpc85xx/fdt.c @@ -220,12 +220,19 @@ static inline void ft_fixup_l2cache(void *blob)  	/* we dont bother w/L3 since no platform of this type has one */  } -#elif defined(CONFIG_BACKSIDE_L2_CACHE) +#elif defined(CONFIG_BACKSIDE_L2_CACHE) || \ +	defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2)  static inline void ft_fixup_l2cache(void *blob)  {  	int off, l2_off, l3_off = -1;  	u32 *ph; +#ifdef	CONFIG_BACKSIDE_L2_CACHE  	u32 l2cfg0 = mfspr(SPRN_L2CFG0); +#else +	struct ccsr_cluster_l2 *l2cache = +		(struct ccsr_cluster_l2 __iomem *)(CONFIG_SYS_FSL_CLUSTER_1_L2); +	u32 l2cfg0 = in_be32(&l2cache->l2cfg0); +#endif  	u32 size, line_size, num_ways, num_sets;  	int has_l2 = 1; @@ -257,7 +264,12 @@ static inline void ft_fixup_l2cache(void *blob)  		if (has_l2) {  #ifdef CONFIG_SYS_CACHE_STASHING  			u32 *reg = (u32 *)fdt_getprop(blob, off, "reg", 0); +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +			/* Only initialize every eighth thread */ +			if (reg && !((*reg) % 8)) +#else  			if (reg) +#endif  				fdt_setprop_cell(blob, l2_off, "cache-stash-id",  					 (*reg * 2) + 32 + 1);  #endif diff --git a/arch/powerpc/cpu/mpc85xx/release.S b/arch/powerpc/cpu/mpc85xx/release.S index 8662ae438..23a3aaf48 100644 --- a/arch/powerpc/cpu/mpc85xx/release.S +++ b/arch/powerpc/cpu/mpc85xx/release.S @@ -183,13 +183,6 @@ __secondary_start_page:  	slwi	r8,r4,5  	add	r10,r3,r8 -#if defined(CONFIG_E500MC) && defined(CONFIG_SYS_CACHE_STASHING) -	/* set stash id to (coreID) * 2 + 32 + L1 CT (0) */ -	slwi	r8,r4,1 -	addi	r8,r8,32 -	mtspr	L1CSR2,r8 -#endif -  #ifdef CONFIG_E6500  	mfspr	r0,SPRN_PIR  	/* @@ -209,6 +202,13 @@ __secondary_start_page:  	mtspr	SPRN_PIR,r4	/* write to PIR register */ +#ifdef CONFIG_SYS_CACHE_STASHING +	/* set stash id to (coreID) * 2 + 32 + L1 CT (0) */ +	slwi	r8,r4,1 +	addi	r8,r8,32 +	mtspr	L1CSR2,r8 +#endif +  #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \  	defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011)  	/* diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index e28ec558e..ac17f9d3c 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -169,7 +169,7 @@ l2_disabled:  	 *  	 */ -#if defined(CONFIG_E500MC) && defined(CONFIG_SYS_CACHE_STASHING) +#ifdef CONFIG_SYS_CACHE_STASHING  	/* set stash id to (coreID) * 2 + 32 + L1 CT (0) */  	li	r2,(32 + 0)  	mtspr	L1CSR2,r2 @@ -750,6 +750,41 @@ delete_temp_tlbs:  #endif /* #if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) */ +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +create_ccsr_l2_tlb: +	/* +	 * Create a TLB for the MMR location of CCSR +	 * to access L2CSR0 register +	 */ +	create_tlb0_entry 0, \ +		0, BOOKE_PAGESZ_4K, \ +		CONFIG_SYS_CCSRBAR + 0xC20000, MAS2_I|MAS2_G, \ +		CONFIG_SYS_CCSRBAR_PHYS_LOW + 0xC20000, MAS3_SW|MAS3_SR, \ +		CONFIG_SYS_CCSRBAR_PHYS_HIGH, r3 + +enable_l2_cluster_l2: +	/* enable L2 cache */ +	lis	r3, (CONFIG_SYS_CCSRBAR + 0xC20000)@h +	ori	r3, r3, (CONFIG_SYS_CCSRBAR + 0xC20000)@l +	li	r4, 33	/* stash id */ +	stw	r4, 4(r3) +	lis	r4, (L2CSR0_L2FI|L2CSR0_L2LFC)@h +	ori	r4, r4, (L2CSR0_L2FI|L2CSR0_L2LFC)@l +	sync +	stw	r4, 0(r3)	/* invalidate L2 */ +1:	sync +	lwz	r0, 0(r3) +	twi	0, r0, 0 +	isync +	and.	r1, r0, r4 +	bne	1b +	lis	r4, L2CSR0_L2E@h +	sync +	stw	r4, 0(r3)	/* eanble L2 */ +delete_ccsr_l2_tlb: +	delete_tlb0_entry 0, CONFIG_SYS_CCSRBAR + 0xC20000, MAS2_I|MAS2_G, r3 +#endif +  #ifdef CONFIG_SYS_FSL_ERRATUM_A004510  #define DCSR_LAWBARH0	(CONFIG_SYS_CCSRBAR + 0x1000)  #define LAW_SIZE_1M	0x13 |