powerpc/64: Retrieve number of L1 cache sets from device-tree
It will be used to calculate the associativity Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
		
							parent
							
								
									bd067f83b0
								
							
						
					
					
						commit
						5d451a87e5
					
				| @ -36,11 +36,13 @@ struct ppc64_caches { | ||||
| 	u32	dblock_size;		/* L1 d-cache block size */ | ||||
| 	u32	log_dblock_size; | ||||
| 	u32	dblocks_per_page; | ||||
| 	u32	dsets; | ||||
| 	u32	isize;			/* L1 i-cache size */ | ||||
| 	u32	iline_size;		/* L1 d-cache line size	*/ | ||||
| 	u32	iblock_size;		/* L1 i-cache block size */ | ||||
| 	u32	log_iblock_size; | ||||
| 	u32	iblocks_per_page; | ||||
| 	u32	isets; | ||||
| }; | ||||
| 
 | ||||
| extern struct ppc64_caches ppc64_caches; | ||||
|  | ||||
| @ -412,14 +412,18 @@ void __init initialize_cache_info(void) | ||||
| 		 * d-cache and i-cache sizes... -Peter | ||||
| 		 */ | ||||
| 		if (num_cpus == 1) { | ||||
| 			const __be32 *sizep, *lsizep, *bsizep; | ||||
| 			u32 size, lsize, bsize; | ||||
| 			const __be32 *sizep, *lsizep, *bsizep, *setsp; | ||||
| 			u32 size, lsize, bsize, sets; | ||||
| 
 | ||||
| 			size = 0; | ||||
| 			sets = -1u; | ||||
| 			lsize = bsize = cur_cpu_spec->dcache_bsize; | ||||
| 			sizep = of_get_property(np, "d-cache-size", NULL); | ||||
| 			if (sizep != NULL) | ||||
| 				size = be32_to_cpu(*sizep); | ||||
| 			setsp = of_get_property(np, "d-cache-sets", NULL); | ||||
| 			if (setsp != NULL) | ||||
| 				sets = be32_to_cpu(*setsp); | ||||
| 			bsizep = of_get_property(np, "d-cache-block-size", | ||||
| 						 NULL); | ||||
| 			lsizep = of_get_property(np, "d-cache-line-size", | ||||
| @ -435,17 +439,32 @@ void __init initialize_cache_info(void) | ||||
| 				    "sizep: %p, bsizep: %p, lsizep: %p\n", | ||||
| 				    sizep, bsizep, lsizep); | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * OF is weird .. it represents fully associative caches | ||||
| 			 * as "1 way" which doesn't make much sense and doesn't | ||||
| 			 * leave room for direct mapped. We'll assume that 0 | ||||
| 			 * in OF means direct mapped for that reason. | ||||
| 			 */ | ||||
| 			if (sets == 1) | ||||
| 				sets = 0; | ||||
| 			else if (sets == 0) | ||||
| 				sets = 1; | ||||
| 			ppc64_caches.dsize = size; | ||||
| 			ppc64_caches.dsets = sets; | ||||
| 			ppc64_caches.dline_size = lsize; | ||||
| 			ppc64_caches.dblock_size = bsize; | ||||
| 			ppc64_caches.log_dblock_size = __ilog2(bsize); | ||||
| 			ppc64_caches.dblocks_per_page = PAGE_SIZE / bsize; | ||||
| 
 | ||||
| 			size = 0; | ||||
| 			sets = -1u; | ||||
| 			lsize = bsize = cur_cpu_spec->icache_bsize; | ||||
| 			sizep = of_get_property(np, "i-cache-size", NULL); | ||||
| 			if (sizep != NULL) | ||||
| 				size = be32_to_cpu(*sizep); | ||||
| 			setsp = of_get_property(np, "i-cache-sets", NULL); | ||||
| 			if (setsp != NULL) | ||||
| 				sets = be32_to_cpu(*setsp); | ||||
| 			bsizep = of_get_property(np, "i-cache-block-size", | ||||
| 						 NULL); | ||||
| 			lsizep = of_get_property(np, "i-cache-line-size", | ||||
| @ -461,7 +480,12 @@ void __init initialize_cache_info(void) | ||||
| 				    "sizep: %p, bsizep: %p, lsizep: %p\n", | ||||
| 				    sizep, bsizep, lsizep); | ||||
| 
 | ||||
| 			if (sets == 1) | ||||
| 				sets = 0; | ||||
| 			else if (sets == 0) | ||||
| 				sets = 1; | ||||
| 			ppc64_caches.isize = size; | ||||
| 			ppc64_caches.isets = sets; | ||||
| 			ppc64_caches.iline_size = lsize; | ||||
| 			ppc64_caches.iblock_size = bsize; | ||||
| 			ppc64_caches.log_iblock_size = __ilog2(bsize); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user