Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d451a87 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Michael Ellerman
Browse files

powerpc/64: Retrieve number of L1 cache sets from device-tree



It will be used to calculate the associativity

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent bd067f83
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -36,11 +36,13 @@ struct ppc64_caches {
	u32	dblock_size;		/* L1 d-cache block size */
	u32	dblock_size;		/* L1 d-cache block size */
	u32	log_dblock_size;
	u32	log_dblock_size;
	u32	dblocks_per_page;
	u32	dblocks_per_page;
	u32	dsets;
	u32	isize;			/* L1 i-cache size */
	u32	isize;			/* L1 i-cache size */
	u32	iline_size;		/* L1 d-cache line size	*/
	u32	iline_size;		/* L1 d-cache line size	*/
	u32	iblock_size;		/* L1 i-cache block size */
	u32	iblock_size;		/* L1 i-cache block size */
	u32	log_iblock_size;
	u32	log_iblock_size;
	u32	iblocks_per_page;
	u32	iblocks_per_page;
	u32	isets;
};
};


extern struct ppc64_caches ppc64_caches;
extern struct ppc64_caches ppc64_caches;
+26 −2
Original line number Original line Diff line number Diff line
@@ -412,14 +412,18 @@ void __init initialize_cache_info(void)
		 * d-cache and i-cache sizes... -Peter
		 * d-cache and i-cache sizes... -Peter
		 */
		 */
		if (num_cpus == 1) {
		if (num_cpus == 1) {
			const __be32 *sizep, *lsizep, *bsizep;
			const __be32 *sizep, *lsizep, *bsizep, *setsp;
			u32 size, lsize, bsize;
			u32 size, lsize, bsize, sets;


			size = 0;
			size = 0;
			sets = -1u;
			lsize = bsize = cur_cpu_spec->dcache_bsize;
			lsize = bsize = cur_cpu_spec->dcache_bsize;
			sizep = of_get_property(np, "d-cache-size", NULL);
			sizep = of_get_property(np, "d-cache-size", NULL);
			if (sizep != NULL)
			if (sizep != NULL)
				size = be32_to_cpu(*sizep);
				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",
			bsizep = of_get_property(np, "d-cache-block-size",
						 NULL);
						 NULL);
			lsizep = of_get_property(np, "d-cache-line-size",
			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: %p, bsizep: %p, lsizep: %p\n",
				    sizep, bsizep, lsizep);
				    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.dsize = size;
			ppc64_caches.dsets = sets;
			ppc64_caches.dline_size = lsize;
			ppc64_caches.dline_size = lsize;
			ppc64_caches.dblock_size = bsize;
			ppc64_caches.dblock_size = bsize;
			ppc64_caches.log_dblock_size = __ilog2(bsize);
			ppc64_caches.log_dblock_size = __ilog2(bsize);
			ppc64_caches.dblocks_per_page = PAGE_SIZE / bsize;
			ppc64_caches.dblocks_per_page = PAGE_SIZE / bsize;


			size = 0;
			size = 0;
			sets = -1u;
			lsize = bsize = cur_cpu_spec->icache_bsize;
			lsize = bsize = cur_cpu_spec->icache_bsize;
			sizep = of_get_property(np, "i-cache-size", NULL);
			sizep = of_get_property(np, "i-cache-size", NULL);
			if (sizep != NULL)
			if (sizep != NULL)
				size = be32_to_cpu(*sizep);
				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",
			bsizep = of_get_property(np, "i-cache-block-size",
						 NULL);
						 NULL);
			lsizep = of_get_property(np, "i-cache-line-size",
			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: %p, bsizep: %p, lsizep: %p\n",
				    sizep, bsizep, lsizep);
				    sizep, bsizep, lsizep);


			if (sets == 1)
				sets = 0;
			else if (sets == 0)
				sets = 1;
			ppc64_caches.isize = size;
			ppc64_caches.isize = size;
			ppc64_caches.isets = sets;
			ppc64_caches.iline_size = lsize;
			ppc64_caches.iline_size = lsize;
			ppc64_caches.iblock_size = bsize;
			ppc64_caches.iblock_size = bsize;
			ppc64_caches.log_iblock_size = __ilog2(bsize);
			ppc64_caches.log_iblock_size = __ilog2(bsize);