xref: /aosp_15_r20/external/cpuinfo/src/arm/cache.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #include <stdint.h>
2*2b54f0dbSXin Li 
3*2b54f0dbSXin Li #include <cpuinfo.h>
4*2b54f0dbSXin Li #include <cpuinfo/internal-api.h>
5*2b54f0dbSXin Li #include <cpuinfo/log.h>
6*2b54f0dbSXin Li #include <arm/api.h>
7*2b54f0dbSXin Li #include <arm/midr.h>
8*2b54f0dbSXin Li 
9*2b54f0dbSXin Li 
cpuinfo_arm_decode_cache(enum cpuinfo_uarch uarch,uint32_t cluster_cores,uint32_t midr,const struct cpuinfo_arm_chipset chipset[restrict static1],uint32_t cluster_id,uint32_t arch_version,struct cpuinfo_cache l1i[restrict static1],struct cpuinfo_cache l1d[restrict static1],struct cpuinfo_cache l2[restrict static1],struct cpuinfo_cache l3[restrict static1])10*2b54f0dbSXin Li void cpuinfo_arm_decode_cache(
11*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch,
12*2b54f0dbSXin Li 	uint32_t cluster_cores,
13*2b54f0dbSXin Li 	uint32_t midr,
14*2b54f0dbSXin Li 	const struct cpuinfo_arm_chipset chipset[restrict static 1],
15*2b54f0dbSXin Li 	uint32_t cluster_id,
16*2b54f0dbSXin Li 	uint32_t arch_version,
17*2b54f0dbSXin Li 	struct cpuinfo_cache l1i[restrict static 1],
18*2b54f0dbSXin Li 	struct cpuinfo_cache l1d[restrict static 1],
19*2b54f0dbSXin Li 	struct cpuinfo_cache l2[restrict static 1],
20*2b54f0dbSXin Li 	struct cpuinfo_cache l3[restrict static 1])
21*2b54f0dbSXin Li {
22*2b54f0dbSXin Li 	switch (uarch) {
23*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_8A__)
24*2b54f0dbSXin Li 		case cpuinfo_uarch_xscale:
25*2b54f0dbSXin Li 			switch (midr_get_part(midr) >> 8) {
26*2b54f0dbSXin Li 				case 2:
27*2b54f0dbSXin Li 					/*
28*2b54f0dbSXin Li 					 * PXA 210/25X/26X
29*2b54f0dbSXin Li 					 *
30*2b54f0dbSXin Li 					 * See "Computer Organization and Design, Revised Printing: The Hardware/Software Interface"
31*2b54f0dbSXin Li 					 *     by David A. Patterson, John L. Hennessy
32*2b54f0dbSXin Li 					 */
33*2b54f0dbSXin Li 					*l1i = (struct cpuinfo_cache) {
34*2b54f0dbSXin Li 						.size = 16 * 1024,
35*2b54f0dbSXin Li 						.associativity = 32,
36*2b54f0dbSXin Li 						.line_size = 32
37*2b54f0dbSXin Li 					};
38*2b54f0dbSXin Li 					*l1d = (struct cpuinfo_cache) {
39*2b54f0dbSXin Li 						.size = 16 * 1024,
40*2b54f0dbSXin Li 						.associativity = 4,
41*2b54f0dbSXin Li 						.line_size = 64
42*2b54f0dbSXin Li 					};
43*2b54f0dbSXin Li 					break;
44*2b54f0dbSXin Li 				case 4:
45*2b54f0dbSXin Li 					/* PXA 27X */
46*2b54f0dbSXin Li 					*l1i = (struct cpuinfo_cache) {
47*2b54f0dbSXin Li 						.size = 32 * 1024,
48*2b54f0dbSXin Li 						.associativity = 32,
49*2b54f0dbSXin Li 						.line_size = 32
50*2b54f0dbSXin Li 					};
51*2b54f0dbSXin Li 					*l1d = (struct cpuinfo_cache) {
52*2b54f0dbSXin Li 						.size = 32 * 1024,
53*2b54f0dbSXin Li 						.associativity = 32,
54*2b54f0dbSXin Li 						.line_size = 32
55*2b54f0dbSXin Li 					};
56*2b54f0dbSXin Li 					break;
57*2b54f0dbSXin Li 				case 6:
58*2b54f0dbSXin Li 					/*
59*2b54f0dbSXin Li 					 * PXA 3XX
60*2b54f0dbSXin Li 					 *
61*2b54f0dbSXin Li 					 * See http://download.intel.com/design/intelxscale/31628302.pdf
62*2b54f0dbSXin Li 					 */
63*2b54f0dbSXin Li 					*l1i = (struct cpuinfo_cache) {
64*2b54f0dbSXin Li 						.size = 32 * 1024,
65*2b54f0dbSXin Li 						.associativity = 4,
66*2b54f0dbSXin Li 						.line_size = 32
67*2b54f0dbSXin Li 					};
68*2b54f0dbSXin Li 					*l1d = (struct cpuinfo_cache) {
69*2b54f0dbSXin Li 						.size = 32 * 1024,
70*2b54f0dbSXin Li 						.associativity = 4,
71*2b54f0dbSXin Li 						.line_size = 32
72*2b54f0dbSXin Li 					};
73*2b54f0dbSXin Li 					*l2 = (struct cpuinfo_cache) {
74*2b54f0dbSXin Li 						.size = 256 * 1024,
75*2b54f0dbSXin Li 						.associativity = 8,
76*2b54f0dbSXin Li 						.line_size = 32
77*2b54f0dbSXin Li 					};
78*2b54f0dbSXin Li 					break;
79*2b54f0dbSXin Li 			}
80*2b54f0dbSXin Li 			break;
81*2b54f0dbSXin Li 		case cpuinfo_uarch_arm11:
82*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
83*2b54f0dbSXin Li 				.size = 16 * 1024,
84*2b54f0dbSXin Li 				.associativity = 4,
85*2b54f0dbSXin Li 				.line_size = 32
86*2b54f0dbSXin Li 			};
87*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
88*2b54f0dbSXin Li 				.size = 16 * 1024,
89*2b54f0dbSXin Li 				.associativity = 4,
90*2b54f0dbSXin Li 				.line_size = 32
91*2b54f0dbSXin Li 			};
92*2b54f0dbSXin Li 			break;
93*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_8A__) */
94*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_8A__)
95*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a5:
96*2b54f0dbSXin Li 			/*
97*2b54f0dbSXin Li 			 * Cortex-A5 Technical Reference Manual:
98*2b54f0dbSXin Li 			 * 7.1.1. Memory system
99*2b54f0dbSXin Li 			 *   The Cortex-A5 processor has separate instruction and data caches.
100*2b54f0dbSXin Li 			 *   The caches have the following features:
101*2b54f0dbSXin Li 			 *    - Data cache is 4-way set-associative.
102*2b54f0dbSXin Li 			 *    - Instruction cache is 2-way set-associative.
103*2b54f0dbSXin Li 			 *    - The cache line length is eight words.
104*2b54f0dbSXin Li 			 *    - You can configure the instruction and data caches independently during implementation
105*2b54f0dbSXin Li 			 *      to sizes of 4KB, 8KB, 16KB, 32KB, or 64KB.
106*2b54f0dbSXin Li 			 * 1.1.3. System design components
107*2b54f0dbSXin Li 			 *    PrimeCell Level 2 Cache Controller (PL310)
108*2b54f0dbSXin Li 			 *      The addition of an on-chip secondary cache, also referred to as a Level 2 or L2 cache, is a
109*2b54f0dbSXin Li 			 *      recognized method of improving the performance of ARM-based systems when significant memory traffic
110*2b54f0dbSXin Li 			 *      is generated by the processor. The PrimeCell Level 2 Cache Controller reduces the number of external
111*2b54f0dbSXin Li 			 *      memory accesses and has been optimized for use with the Cortex-A5 processor.
112*2b54f0dbSXin Li 			 * 8.1.7. Exclusive L2 cache
113*2b54f0dbSXin Li 			 *    The Cortex-A5 processor can be connected to an L2 cache that supports an exclusive cache mode.
114*2b54f0dbSXin Li 			 *    This mode must be activated both in the Cortex-A5 processor and in the L2 cache controller.
115*2b54f0dbSXin Li 			 *
116*2b54f0dbSXin Li 			 *  +--------------------+-----------+-----------+----------+-----------+
117*2b54f0dbSXin Li 			 *  | Processor model    | L1D cache | L1I cache | L2 cache | Reference |
118*2b54f0dbSXin Li 			 *  +--------------------+-----------+-----------+----------+-----------+
119*2b54f0dbSXin Li 			 *  | Qualcomm MSM7225A  |           |           |          |           |
120*2b54f0dbSXin Li 			 *  | Qualcomm MSM7625A  |           |           |          |           |
121*2b54f0dbSXin Li 			 *  | Qualcomm MSM7227A  |           |           |          |           |
122*2b54f0dbSXin Li 			 *  | Qualcomm MSM7627A  |    32K    |    32K    |   256K   | Wiki [1]  |
123*2b54f0dbSXin Li 			 *  | Qualcomm MSM7225AB |           |           |          |           |
124*2b54f0dbSXin Li 			 *  | Qualcomm MSM7225AB |           |           |          |           |
125*2b54f0dbSXin Li 			 *  | Qualcomm QSD8250   |           |           |          |           |
126*2b54f0dbSXin Li 			 *  | Qualcomm QSD8650   |           |           |          |           |
127*2b54f0dbSXin Li 			 *  +--------------------+-----------+-----------+----------+-----------+
128*2b54f0dbSXin Li 			 *  | Spreadtrum SC6821  |    32K    |    32K    |    ?     |           |
129*2b54f0dbSXin Li 			 *  | Spreadtrum SC6825  |    32K    |    32K    |   256K   | Wiki [2]  |
130*2b54f0dbSXin Li 			 *  | Spreadtrum SC8810  |     ?     |     ?     |    ?     |           |
131*2b54f0dbSXin Li 			 *  | Spreadtrum SC8825  |    32K    |    32K    |    ?     |           |
132*2b54f0dbSXin Li 			 *  +--------------------+-----------+-----------+----------+-----------+
133*2b54f0dbSXin Li 			 *
134*2b54f0dbSXin Li 			 * [1] https://en.wikipedia.org/wiki/List_of_Qualcomm_Snapdragon_systems-on-chip#Snapdragon_S1
135*2b54f0dbSXin Li 			 * [2] https://en.wikipedia.org/wiki/Spreadtrum
136*2b54f0dbSXin Li 			 */
137*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
138*2b54f0dbSXin Li 				.size = 32 * 1024,
139*2b54f0dbSXin Li 				.associativity = 2,
140*2b54f0dbSXin Li 				.line_size = 32
141*2b54f0dbSXin Li 			};
142*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
143*2b54f0dbSXin Li 				.size = 32 * 1024,
144*2b54f0dbSXin Li 				.associativity = 4,
145*2b54f0dbSXin Li 				.line_size = 32
146*2b54f0dbSXin Li 			};
147*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
148*2b54f0dbSXin Li 				.size = 256 * 1024,
149*2b54f0dbSXin Li 				/*
150*2b54f0dbSXin Li 				 * Follow NXP specification: "Eight-way set-associative 512 kB L2 cache with 32B line size"
151*2b54f0dbSXin Li 				 * Reference: http://www.nxp.com/assets/documents/data/en/application-notes/AN4947.pdf
152*2b54f0dbSXin Li 				 */
153*2b54f0dbSXin Li 				.associativity = 8,
154*2b54f0dbSXin Li 				.line_size = 32
155*2b54f0dbSXin Li 			};
156*2b54f0dbSXin Li 			break;
157*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a7:
158*2b54f0dbSXin Li 			/*
159*2b54f0dbSXin Li 			 * Cortex-A7 MPCore Technical Reference Manual:
160*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
161*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. You can configure the
162*2b54f0dbSXin Li 			 *   instruction and data caches independently during implementation to sizes of 8KB, 16KB, 32KB, or 64KB.
163*2b54f0dbSXin Li 			 *
164*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following features:
165*2b54f0dbSXin Li 			 *    - Instruction side cache line length of 32-bytes.
166*2b54f0dbSXin Li 			 *    - 2-way set-associative instruction cache.
167*2b54f0dbSXin Li 			 *
168*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
169*2b54f0dbSXin Li 			 *    - Data side cache line length of 64-bytes.
170*2b54f0dbSXin Li 			 *    - 4-way set-associative data cache.
171*2b54f0dbSXin Li 			 *
172*2b54f0dbSXin Li 			 * 7.1. About the L2 Memory system
173*2b54f0dbSXin Li 			 *   The L2 memory system consists of an:
174*2b54f0dbSXin Li 			 *    - Optional tightly-coupled L2 cache that includes:
175*2b54f0dbSXin Li 			 *      - Configurable L2 cache size of 128KB, 256KB, 512KB, and 1MB.
176*2b54f0dbSXin Li 			 *      - Fixed line length of 64 bytes
177*2b54f0dbSXin Li 			 *      - 8-way set-associative cache structure
178*2b54f0dbSXin Li 			 *
179*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
180*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
181*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
182*2b54f0dbSXin Li 			 *  | Allwinner A20      |   2   |    32K    |    32K    |   256K    |    [1]    |
183*2b54f0dbSXin Li 			 *  | Allwinner A23      |   2   |    32K    |    32K    |   256K    |    [2]    |
184*2b54f0dbSXin Li 			 *  | Allwinner A31      |   4   |    32K    |    32K    |    1M     |    [3]    |
185*2b54f0dbSXin Li 			 *  | Allwinner A31s     |   4   |    32K    |    32K    |    1M     |    [4]    |
186*2b54f0dbSXin Li 			 *  | Allwinner A33      |   4   |    32K    |    32K    |   512K    |    [5]    |
187*2b54f0dbSXin Li 			 *  | Allwinner A80 Octa | 4(+4) |    32K    |    32K    | 512K(+2M) |    [6]    |
188*2b54f0dbSXin Li 			 *  | Allwinner A81T     |   8   |    32K    |    32K    |    1M     |    [7]    |
189*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
190*2b54f0dbSXin Li 			 *  | Broadcom BCM2836   |   4   |    32K    |    32K    |    512K   |    [8]    |
191*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
192*2b54f0dbSXin Li 			 *  | Kirin 920          | 4(+4) |     ?     |     ?     |    512K   |    [9]    |
193*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
194*2b54f0dbSXin Li 			 *
195*2b54f0dbSXin Li 			 * [1] https://linux-sunxi.org/A20
196*2b54f0dbSXin Li 			 * [2] https://linux-sunxi.org/A23
197*2b54f0dbSXin Li 			 * [3] http://dl.linux-sunxi.org/A31/A3x_release_document/A31/IC/A31%20datasheet%20V1.3%2020131106.pdf
198*2b54f0dbSXin Li 			 * [4] https://github.com/allwinner-zh/documents/blob/master/A31s/A31s_Datasheet_v1.5_20150510.pdf
199*2b54f0dbSXin Li 			 * [5] http://dl.linux-sunxi.org/A33/A33_Datasheet_release1.0.pdf
200*2b54f0dbSXin Li 			 * [6] https://linux-sunxi.org/images/1/10/A80_Datasheet_Revision_1.0_0404.pdf
201*2b54f0dbSXin Li 			 * [7] http://dl.linux-sunxi.org/A83T/A83T_datasheet_Revision_1.1.pdf
202*2b54f0dbSXin Li 			 * [8] https://www.raspberrypi.org/forums/viewtopic.php?t=98428
203*2b54f0dbSXin Li 			 * [9] http://www.gizmochina.com/2014/10/07/hisilicon-kirin-920-tear-down/
204*2b54f0dbSXin Li 			 */
205*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
206*2b54f0dbSXin Li 				.size = 32 * 1024,
207*2b54f0dbSXin Li 				.associativity = 2,
208*2b54f0dbSXin Li 				.line_size = 32
209*2b54f0dbSXin Li 			};
210*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
211*2b54f0dbSXin Li 				.size = 32 * 1024,
212*2b54f0dbSXin Li 				.associativity = 4,
213*2b54f0dbSXin Li 				.line_size = 64
214*2b54f0dbSXin Li 			};
215*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
216*2b54f0dbSXin Li 				.size = 128 * 1024 * cluster_cores,
217*2b54f0dbSXin Li 				.associativity = 8,
218*2b54f0dbSXin Li 				.line_size = 64
219*2b54f0dbSXin Li 			};
220*2b54f0dbSXin Li 			break;
221*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a8:
222*2b54f0dbSXin Li 			/*
223*2b54f0dbSXin Li 			 * Cortex-A8 Technical Reference Manual:
224*2b54f0dbSXin Li 			 * 7.1. About the L1 memory system
225*2b54f0dbSXin Li 			 *    The L1 memory system consists of separate instruction and data caches in a Harvard arrangement.
226*2b54f0dbSXin Li 			 *    The L1 memory system provides the core with:
227*2b54f0dbSXin Li 			 *     - fixed line length of 64 bytes
228*2b54f0dbSXin Li 			 *     - support for 16KB or 32KB caches
229*2b54f0dbSXin Li 			 *     - 4-way set associative cache structure
230*2b54f0dbSXin Li 			 * 8.1. About the L2 memory system
231*2b54f0dbSXin Li 			 *    The L2 memory system is tightly coupled to the L1 data cache and L1 instruction cache.
232*2b54f0dbSXin Li 			 *    The key features of the L2 memory system include:
233*2b54f0dbSXin Li 			 *     - configurable cache size of 0KB, 128KB, 256KB, 512KB, and 1MB
234*2b54f0dbSXin Li 			 *     - fixed line length of 64 bytes
235*2b54f0dbSXin Li 			 *     - 8-way set associative cache structure
236*2b54f0dbSXin Li 			 *
237*2b54f0dbSXin Li 			 *  +----------------------+-----------+-----------+-----------+-----------+
238*2b54f0dbSXin Li 			 *  | Processor model      | L1D cache | L1I cache | L2 cache  | Reference |
239*2b54f0dbSXin Li 			 *  +----------------------+-----------+-----------+-----------+-----------+
240*2b54f0dbSXin Li 			 *  | Exynos 3 Single 3110 |    32K    |    32K    |   512K    |    [1]    |
241*2b54f0dbSXin Li 			 *  +----------------------+-----------+-----------+-----------+-----------+
242*2b54f0dbSXin Li 			 *  | TI DM 3730           |    32K    |    32K    |   256K    |    [2]    |
243*2b54f0dbSXin Li 			 *  +----------------------+-----------+-----------+-----------+-----------+
244*2b54f0dbSXin Li 			 *
245*2b54f0dbSXin Li 			 * [1] https://en.wikichip.org/w/images/0/04/Exynos_3110.pdf
246*2b54f0dbSXin Li 			 * [2] https://www.ti.com/lit/ds/symlink/dm3725.pdf
247*2b54f0dbSXin Li 			 */
248*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
249*2b54f0dbSXin Li 				.size = 32 * 1024,
250*2b54f0dbSXin Li 				.associativity = 4,
251*2b54f0dbSXin Li 				.line_size = 64
252*2b54f0dbSXin Li 			};
253*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
254*2b54f0dbSXin Li 				.size = 32 * 1024,
255*2b54f0dbSXin Li 				.associativity = 4,
256*2b54f0dbSXin Li 				.line_size = 64
257*2b54f0dbSXin Li 			};
258*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
259*2b54f0dbSXin Li 				.associativity = 8,
260*2b54f0dbSXin Li 				.line_size = 64
261*2b54f0dbSXin Li 			};
262*2b54f0dbSXin Li 			switch (chipset->vendor) {
263*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_vendor_samsung:
264*2b54f0dbSXin Li 					l2->size = 512 * 1024;
265*2b54f0dbSXin Li 					break;
266*2b54f0dbSXin Li 				default:
267*2b54f0dbSXin Li 					l2->size = 256 * 1024;
268*2b54f0dbSXin Li 					break;
269*2b54f0dbSXin Li 			}
270*2b54f0dbSXin Li 
271*2b54f0dbSXin Li 			break;
272*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a9:
273*2b54f0dbSXin Li 			/*
274*2b54f0dbSXin Li 			 * ARM Cortex‑A9 Technical Reference Manual:
275*2b54f0dbSXin Li 			 * 7.1.1 Memory system
276*2b54f0dbSXin Li 			 *    The Cortex‑A9 processor has separate instruction and data caches.
277*2b54f0dbSXin Li 			 *    The caches have the following features:
278*2b54f0dbSXin Li 			 *     - Both caches are 4-way set-associative.
279*2b54f0dbSXin Li 			 *     - The cache line length is eight words.
280*2b54f0dbSXin Li 			 *     - You can configure the instruction and data caches independently during implementation
281*2b54f0dbSXin Li 			 *       to sizes of 16KB, 32KB, or 64KB.
282*2b54f0dbSXin Li 			 * 8.1.5 Exclusive L2 cache
283*2b54f0dbSXin Li 			 *    The Cortex‑A9 processor can be connected to an L2 cache that supports an exclusive cache mode.
284*2b54f0dbSXin Li 			 *    This mode must be activated both in the Cortex‑A9 processor and in the L2 cache controller.
285*2b54f0dbSXin Li 			 *
286*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
287*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
288*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
289*2b54f0dbSXin Li 			 *  | Exynos 4 Dual 4210 |   2   |    32K    |    32K    |    1M     |    [1]    |
290*2b54f0dbSXin Li 			 *  | Exynos 4 Dual 4212 |   2   |    32K    |    32K    |    1M     |    [2]    |
291*2b54f0dbSXin Li 			 *  | Exynos 4 Quad 4412 |   4   |    32K    |    32K    |    1M     |    [3]    |
292*2b54f0dbSXin Li 			 *  | Exynos 4 Quad 4415 |   4   |    32K    |    32K    |    1M     |           |
293*2b54f0dbSXin Li 			 *  | TI OMAP 4430       |   2   |    32K    |    32K    |    1M     |    [4]    |
294*2b54f0dbSXin Li 			 *  | TI OMAP 4460       |   2   |    32K    |    32K    |    1M     |    [5]    |
295*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
296*2b54f0dbSXin Li 			 *
297*2b54f0dbSXin Li 			 * [1] http://www.samsung.com/global/business/semiconductor/file/product/Exynos_4_Dual_45nm_User_Manaul_Public_REV1.00-0.pdf
298*2b54f0dbSXin Li 			 * [2] http://www.samsung.com/global/business/semiconductor/file/product/Exynos_4_Dual_32nm_User_Manaul_Public_REV100-0.pdf
299*2b54f0dbSXin Li 			 * [3] http://www.samsung.com/global/business/semiconductor/file/product/Exynos_4_Quad_User_Manaul_Public_REV1.00-0.pdf
300*2b54f0dbSXin Li 			 * [4] https://www.hotchips.org/wp-content/uploads/hc_archives/hc21/2_mon/HC21.24.400.ClientProcessors-Epub/HC21.24.421.Witt-OMAP4430.pdf
301*2b54f0dbSXin Li 			 * [5] http://www.anandtech.com/show/5310/samsung-galaxy-nexus-ice-cream-sandwich-review/9
302*2b54f0dbSXin Li 			 */
303*2b54f0dbSXin Li 
304*2b54f0dbSXin Li 			/* Use Exynos 4 specs */
305*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
306*2b54f0dbSXin Li 				.size = 32 * 1024,
307*2b54f0dbSXin Li 				.associativity = 4,
308*2b54f0dbSXin Li 				.line_size = 32
309*2b54f0dbSXin Li 			};
310*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
311*2b54f0dbSXin Li 				.size = 32 * 1024,
312*2b54f0dbSXin Li 				.associativity = 4,
313*2b54f0dbSXin Li 				.line_size = 32
314*2b54f0dbSXin Li 			};
315*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
316*2b54f0dbSXin Li 				.size = 1024 * 1024,
317*2b54f0dbSXin Li 				/* OMAP4460 in Pandaboard ES has 16-way set-associative L2 cache */
318*2b54f0dbSXin Li 				.associativity = 16,
319*2b54f0dbSXin Li 				.line_size = 32
320*2b54f0dbSXin Li 			};
321*2b54f0dbSXin Li 			break;
322*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a15:
323*2b54f0dbSXin Li 			/*
324*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
325*2b54f0dbSXin Li 			 *    The L1 memory system consists of separate instruction and data caches.
326*2b54f0dbSXin Li 			 *    The L1 instruction memory system has the following features:
327*2b54f0dbSXin Li 			 *     - 32KB 2-way set-associative instruction cache.
328*2b54f0dbSXin Li 			 *     - Fixed line length of 64 bytes.
329*2b54f0dbSXin Li 			 *    The L1 data memory system has the following features:
330*2b54f0dbSXin Li 			 *     - 32KB 2-way set-associative data cache.
331*2b54f0dbSXin Li 			 *     - Fixed line length of 64 bytes.
332*2b54f0dbSXin Li 			 * 7.1. About the L2 memory system
333*2b54f0dbSXin Li 			 *    The features of the L2 memory system include:
334*2b54f0dbSXin Li 			 *     - Configurable L2 cache size of 512KB, 1MB, 2MB and 4MB.
335*2b54f0dbSXin Li 			 *     - Fixed line length of 64 bytes.
336*2b54f0dbSXin Li 			 *     - 16-way set-associative cache structure.
337*2b54f0dbSXin Li 			 *
338*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
339*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
340*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
341*2b54f0dbSXin Li 			 *  | Exynos 5 Dual 5250 |   2   |    32K    |    32K    |    1M     |    [1]    |
342*2b54f0dbSXin Li 			 *  | Exynos 5 Hexa 5260 | 2(+4) |    32K    |    32K    | 1M(+512K) |    [2]    |
343*2b54f0dbSXin Li 			 *  | Exynos 5 Octa 5410 | 4(+4) |    32K    |    32K    | 2M(+512K) |    [3]    |
344*2b54f0dbSXin Li 			 *  | Exynos 5 Octa 5420 | 4(+4) |    32K    |    32K    | 2M(+512K) |    [3]    |
345*2b54f0dbSXin Li 			 *  | Exynos 5 Octa 5422 | 4(+4) |    32K    |    32K    | 2M(+512K) |    [3]    |
346*2b54f0dbSXin Li 			 *  | Exynos 5 Octa 5430 | 4(+4) |    32K    |    32K    | 2M(+512K) |    [3]    |
347*2b54f0dbSXin Li 			 *  | Exynos 5 Octa 5800 | 4(+4) |    32K    |    32K    | 2M(+512K) |    [3]    |
348*2b54f0dbSXin Li 			 *  | Kirin 920          | 4(+4) |     ?     |     ?     | 2M(+512K) |    [4]    |
349*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
350*2b54f0dbSXin Li 			 *
351*2b54f0dbSXin Li 			 * [1] http://www.arndaleboard.org/wiki/downloads/supports/Exynos_5_Dual_User_Manaul_Public_REV1.00.pdf
352*2b54f0dbSXin Li 			 * [2] http://www.yicsystem.com/wp-content/uploads/2014/08/Espresso5260P-Guide-Book.pdf
353*2b54f0dbSXin Li 			 * [3] http://www.anandtech.com/show/6768/samsung-details-exynos-5-octa-architecture-power-at-isscc-13
354*2b54f0dbSXin Li 			 * [4] http://www.gizmochina.com/2014/10/07/hisilicon-kirin-920-tear-down/
355*2b54f0dbSXin Li 			 */
356*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
357*2b54f0dbSXin Li 				.size = 32 * 1024,
358*2b54f0dbSXin Li 				.associativity = 2,
359*2b54f0dbSXin Li 				.line_size = 64
360*2b54f0dbSXin Li 			};
361*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
362*2b54f0dbSXin Li 				.size = 32 * 1024,
363*2b54f0dbSXin Li 				.associativity = 2,
364*2b54f0dbSXin Li 				.line_size = 64
365*2b54f0dbSXin Li 			};
366*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
367*2b54f0dbSXin Li 				.size = cluster_cores * 512 * 1024,
368*2b54f0dbSXin Li 				.associativity = 16,
369*2b54f0dbSXin Li 				.line_size = 64
370*2b54f0dbSXin Li 			};
371*2b54f0dbSXin Li 			break;
372*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a17:
373*2b54f0dbSXin Li 			/*
374*2b54f0dbSXin Li 			 * ARM Cortex-A17 MPCore Processor Technical Reference Manual:
375*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
376*2b54f0dbSXin Li 			 *    The L1 memory system consists of separate instruction and data caches.
377*2b54f0dbSXin Li 			 *    The size of the instruction cache is implemented as either 32KB or 64KB.
378*2b54f0dbSXin Li 			 *    The size of the data cache is 32KB.
379*2b54f0dbSXin Li 			 *
380*2b54f0dbSXin Li 			 *    The L1 instruction cache has the following features:
381*2b54f0dbSXin Li 			 *     - Instruction side cache line length of 64-bytes.
382*2b54f0dbSXin Li 			 *     - 4-way set-associative instruction cache.
383*2b54f0dbSXin Li 			 *
384*2b54f0dbSXin Li 			 *    The L1 data cache has the following features:
385*2b54f0dbSXin Li 			 *     - Data side cache line length of 64-bytes.
386*2b54f0dbSXin Li 			 *     - 4-way set-associative data cache.
387*2b54f0dbSXin Li 			 *
388*2b54f0dbSXin Li 			 * 7.1. About the L2 Memory system
389*2b54f0dbSXin Li 			 *    An integrated L2 cache:
390*2b54f0dbSXin Li 			 *     - The cache size is implemented as either 256KB, 512KB, 1MB, 2MB, 4MB or 8MB.
391*2b54f0dbSXin Li 			 *     - A fixed line length of 64 bytes.
392*2b54f0dbSXin Li 			 *     - 16-way set-associative cache structure.
393*2b54f0dbSXin Li 			 *
394*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+-----------+
395*2b54f0dbSXin Li 			 *  | Processor model  | Cores | L1D cache | L1I cache | L2 cache  | Reference |
396*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+-----------+
397*2b54f0dbSXin Li 			 *  | MediaTek MT6595  | 4(+4) |    32K    |    32K    | 2M(+512K) |    [1]    |
398*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+-----------+
399*2b54f0dbSXin Li 			 *
400*2b54f0dbSXin Li 			 * [1] https://blog.osakana.net/archives/5268
401*2b54f0dbSXin Li 			 */
402*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
403*2b54f0dbSXin Li 				.size = 32 * 1024,
404*2b54f0dbSXin Li 				.associativity = 4,
405*2b54f0dbSXin Li 				.line_size = 64
406*2b54f0dbSXin Li 			};
407*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
408*2b54f0dbSXin Li 				.size = 32 * 1024,
409*2b54f0dbSXin Li 				.associativity = 4,
410*2b54f0dbSXin Li 				.line_size = 64
411*2b54f0dbSXin Li 			};
412*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
413*2b54f0dbSXin Li 				.size = cluster_cores * 512 * 1024,
414*2b54f0dbSXin Li 				.associativity = 16,
415*2b54f0dbSXin Li 				.line_size = 64
416*2b54f0dbSXin Li 			};
417*2b54f0dbSXin Li 			break;
418*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_8A__) */
419*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a35:
420*2b54f0dbSXin Li 			/*
421*2b54f0dbSXin Li 			 * ARM Cortex‑A35 Processor Technical Reference Manual:
422*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
423*2b54f0dbSXin Li 			 *   The L1 memory system includes several power-saving and performance-enhancing features.
424*2b54f0dbSXin Li 			 *   These include separate instruction and data caches, which can be configured
425*2b54f0dbSXin Li 			 *   independently during implementation to sizes of 8KB, 16KB, 32KB, or 64KB.
426*2b54f0dbSXin Li 			 *
427*2b54f0dbSXin Li 			 *   L1 instruction-side memory system
428*2b54f0dbSXin Li 			 *     A dedicated instruction cache that:
429*2b54f0dbSXin Li 			 *      - is virtually indexed and physically tagged.
430*2b54f0dbSXin Li 			 *      - is 2-way set associative.
431*2b54f0dbSXin Li 			 *      - is configurable to be 8KB, 16KB, 32KB, or 64KB.
432*2b54f0dbSXin Li 			 *      - uses a cache line length of 64 bytes.
433*2b54f0dbSXin Li 			 *
434*2b54f0dbSXin Li 			 *   L1 data-side memory system
435*2b54f0dbSXin Li 			 *     A dedicated data cache that:
436*2b54f0dbSXin Li 			 *      - is physically indexed and physically tagged.
437*2b54f0dbSXin Li 			 *      - is 4-way set associative.
438*2b54f0dbSXin Li 			 *      - is configurable to be 8KB, 16KB, 32KB, or 64KB.
439*2b54f0dbSXin Li 			 *      - uses a cache line length of 64 bytes.
440*2b54f0dbSXin Li 			 *
441*2b54f0dbSXin Li 			 * 7.1. About the L2 memory system
442*2b54f0dbSXin Li 			 *   The L2 cache is 8-way set associative.
443*2b54f0dbSXin Li 			 *   Further features of the L2 cache are:
444*2b54f0dbSXin Li 			 *    - Configurable size of 128KB, 256KB, 512KB, and 1MB.
445*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
446*2b54f0dbSXin Li 			 *    - Physically indexed and tagged.
447*2b54f0dbSXin Li 			 *
448*2b54f0dbSXin Li 			 *  +-----------------+---------+-----------+-----------+-----------+-----------+
449*2b54f0dbSXin Li 			 *  | Processor model |  Cores  | L1D cache | L1I cache | L2 cache  | Reference |
450*2b54f0dbSXin Li 			 *  +-----------------+---------+-----------+-----------+-----------+-----------+
451*2b54f0dbSXin Li 			 *  | MediaTek MT6599 | 4(+4+2) |     ?     |     ?     |     ?     |           |
452*2b54f0dbSXin Li 			 *  +-----------------+---------+-----------+-----------+-----------+-----------+
453*2b54f0dbSXin Li 			 */
454*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
455*2b54f0dbSXin Li 				.size = 16 * 1024, /* assumption based on low-end Cortex-A53 */
456*2b54f0dbSXin Li 				.associativity = 2,
457*2b54f0dbSXin Li 				.line_size = 64
458*2b54f0dbSXin Li 			};
459*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
460*2b54f0dbSXin Li 				.size = 16 * 1024, /* assumption based on low-end Cortex-A53 */
461*2b54f0dbSXin Li 				.associativity = 4,
462*2b54f0dbSXin Li 				.line_size = 64
463*2b54f0dbSXin Li 			};
464*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
465*2b54f0dbSXin Li 				.size = 256 * 1024, /* assumption based on low-end Cortex-A53 */
466*2b54f0dbSXin Li 				.associativity = 8,
467*2b54f0dbSXin Li 				.line_size = 64
468*2b54f0dbSXin Li 			};
469*2b54f0dbSXin Li 			break;
470*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a53:
471*2b54f0dbSXin Li 			/*
472*2b54f0dbSXin Li 			 * ARM Cortex-A53 MPCore Processor Technical Reference Manual:
473*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
474*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. The implementer configures the
475*2b54f0dbSXin Li 			 *   instruction and data caches independently during implementation, to sizes of 8KB, 16KB, 32KB, or 64KB.
476*2b54f0dbSXin Li 			 *
477*2b54f0dbSXin Li 			 *   The L1 Instruction memory system has the following key features:
478*2b54f0dbSXin Li 			 *    - Instruction side cache line length of 64 bytes.
479*2b54f0dbSXin Li 			 *    - 2-way set associative L1 Instruction cache.
480*2b54f0dbSXin Li 			 *
481*2b54f0dbSXin Li 			 *   The L1 Data memory system has the following features:
482*2b54f0dbSXin Li 			 *    - Data side cache line length of 64 bytes.
483*2b54f0dbSXin Li 			 *    - 4-way set associative L1 Data cache.
484*2b54f0dbSXin Li 			 *
485*2b54f0dbSXin Li 			 * 7.1. About the L2 memory system
486*2b54f0dbSXin Li 			 *   The L2 memory system consists of an:
487*2b54f0dbSXin Li 			 *    - Optional tightly-coupled L2 cache that includes:
488*2b54f0dbSXin Li 			 *      - Configurable L2 cache size of 128KB, 256KB, 512KB, 1MB and 2MB.
489*2b54f0dbSXin Li 			 *      - Fixed line length of 64 bytes.
490*2b54f0dbSXin Li 			 *      - 16-way set-associative cache structure.
491*2b54f0dbSXin Li 			 *
492*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
493*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
494*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
495*2b54f0dbSXin Li 			 *  | Broadcom BCM2837   |   4   |    16K    |    16K    |    512K   |    [1]    |
496*2b54f0dbSXin Li 			 *  | Exynos 7420        | 4(+4) |    32K    |    32K    |    256K   |  [2, 3]   |
497*2b54f0dbSXin Li 			 *  | Exynos 8890        | 4(+4) |    32K    |    32K    |    256K   |    [4]    |
498*2b54f0dbSXin Li 			 *  | Rochchip RK3368    |  4+4  |    32K    |    32K    | 512K+256K |   sysfs   |
499*2b54f0dbSXin Li 			 *  | MediaTek MT8173C   | 2(+2) |    32K    |    32K    | 512K(+1M) |   sysfs   |
500*2b54f0dbSXin Li 			 *  | Snapdragon 410     |   4   |    32K    |    32K    |    512K   |    [3]    |
501*2b54f0dbSXin Li 			 *  | Snapdragon 630     |  4+4  |    32K    |    32K    |  1M+512K  |   sysfs   |
502*2b54f0dbSXin Li 			 *  | Snapdragon 636     | 4(+4) |  32K+64K  |  32K+64K  |   1M+1M   |   sysfs   |
503*2b54f0dbSXin Li 			 *  | Snapdragon 660     | 4(+4) |  32K+64K  |  32K+64K  |   1M+1M   |   sysfs   |
504*2b54f0dbSXin Li 			 *  | Snapdragon 835     | 4(+4) |  32K+64K  |  32K+64K  |  1M(+2M)  |   sysfs   |
505*2b54f0dbSXin Li 			 *  | Kirin 620          |  4+4  |    32K    |    32K    |    512K   |    [5]    |
506*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
507*2b54f0dbSXin Li 			 *
508*2b54f0dbSXin Li 			 * [1] https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=145766
509*2b54f0dbSXin Li 			 * [2] http://www.anandtech.com/show/9330/exynos-7420-deep-dive/2
510*2b54f0dbSXin Li 			 * [3] https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_lipp.pdf
511*2b54f0dbSXin Li 			 * [4] http://www.boardset.com/products/products_v8890.php
512*2b54f0dbSXin Li 			 * [5] http://mirror.lemaker.org/Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
513*2b54f0dbSXin Li 			 */
514*2b54f0dbSXin Li 			if (midr_is_qualcomm_cortex_a53_silver(midr)) {
515*2b54f0dbSXin Li 				/* Qualcomm-modified Cortex-A53 in Snapdragon 630/660/835 */
516*2b54f0dbSXin Li 
517*2b54f0dbSXin Li 				uint32_t l2_size = 512 * 1024;
518*2b54f0dbSXin Li 				switch (chipset->series) {
519*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_msm:
520*2b54f0dbSXin Li 						if (chipset->model == 8998) {
521*2b54f0dbSXin Li 							/* Snapdragon 835 (MSM8998): 1 MB L2 (little cores only) */
522*2b54f0dbSXin Li 							l2_size = 1024 * 1024;
523*2b54f0dbSXin Li 						}
524*2b54f0dbSXin Li 						break;
525*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_snapdragon:
526*2b54f0dbSXin Li 						switch (chipset->model) {
527*2b54f0dbSXin Li 							case 630:
528*2b54f0dbSXin Li 								if (cluster_id == 0) {
529*2b54f0dbSXin Li 									/* Snapdragon 630: 1 MB L2 for the big cores */
530*2b54f0dbSXin Li 									l2_size = 1024 * 1024;
531*2b54f0dbSXin Li 								}
532*2b54f0dbSXin Li 								break;
533*2b54f0dbSXin Li 							case 636:
534*2b54f0dbSXin Li 								/* Snapdragon 636: 1 MB L2 (little cores only) */
535*2b54f0dbSXin Li 								l2_size = 1024 * 1024;
536*2b54f0dbSXin Li 								break;
537*2b54f0dbSXin Li 							case 660:
538*2b54f0dbSXin Li 							case 662:
539*2b54f0dbSXin Li 								/* Snapdragon 660: 1 MB L2 (little cores only) */
540*2b54f0dbSXin Li 								l2_size = 1024 * 1024;
541*2b54f0dbSXin Li 								break;
542*2b54f0dbSXin Li 						}
543*2b54f0dbSXin Li 						break;
544*2b54f0dbSXin Li 					default:
545*2b54f0dbSXin Li 						break;
546*2b54f0dbSXin Li 				}
547*2b54f0dbSXin Li 
548*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
549*2b54f0dbSXin Li 					.size = 32 * 1024,
550*2b54f0dbSXin Li 					.associativity = 2,
551*2b54f0dbSXin Li 					.line_size = 64
552*2b54f0dbSXin Li 				};
553*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
554*2b54f0dbSXin Li 					.size = 32 * 1024,
555*2b54f0dbSXin Li 					.associativity = 4,
556*2b54f0dbSXin Li 					.line_size = 64
557*2b54f0dbSXin Li 				};
558*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
559*2b54f0dbSXin Li 					.size = l2_size,
560*2b54f0dbSXin Li 					.associativity = 16,
561*2b54f0dbSXin Li 					.line_size = 64
562*2b54f0dbSXin Li 				};
563*2b54f0dbSXin Li 			} else {
564*2b54f0dbSXin Li 				/* Standard Cortex-A53 */
565*2b54f0dbSXin Li 
566*2b54f0dbSXin Li 				/* Use conservative values by default */
567*2b54f0dbSXin Li 				uint32_t l1_size = 16 * 1024;
568*2b54f0dbSXin Li 				uint32_t l2_size = 256 * 1024;
569*2b54f0dbSXin Li 				switch (chipset->series) {
570*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_msm:
571*2b54f0dbSXin Li 						l1_size = 32 * 1024;
572*2b54f0dbSXin Li 						l2_size = 512 * 1024;
573*2b54f0dbSXin Li 						switch (chipset->model) {
574*2b54f0dbSXin Li 							case 8937: /* Snapdragon 430 */
575*2b54f0dbSXin Li 							case 8940: /* Snapdragon 435 */
576*2b54f0dbSXin Li 							case 8953: /* Snapdragon 625 or 626 (8953PRO) */
577*2b54f0dbSXin Li 								if (cluster_id == 0) {
578*2b54f0dbSXin Li 									/* 1M L2 for big cluster */
579*2b54f0dbSXin Li 									l2_size = 1024 * 1024;
580*2b54f0dbSXin Li 								}
581*2b54f0dbSXin Li 								break;
582*2b54f0dbSXin Li 							case 8952: /* Snapdragon 617 */
583*2b54f0dbSXin Li 								if (cluster_id != 0) {
584*2b54f0dbSXin Li 									/* 256K L2 for LITTLE cluster */
585*2b54f0dbSXin Li 									l2_size = 256 * 1024;
586*2b54f0dbSXin Li 								}
587*2b54f0dbSXin Li 								break;
588*2b54f0dbSXin Li 							default:
589*2b54f0dbSXin Li 								/* Silence compiler warning about unhandled enum values */
590*2b54f0dbSXin Li 								break;
591*2b54f0dbSXin Li 						}
592*2b54f0dbSXin Li 						break;
593*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_apq:
594*2b54f0dbSXin Li 						l1_size = 32 * 1024;
595*2b54f0dbSXin Li 						l2_size = 512 * 1024;
596*2b54f0dbSXin Li 						break;
597*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_snapdragon:
598*2b54f0dbSXin Li 						l1_size = 32 * 1024;
599*2b54f0dbSXin Li 						l2_size = 512 * 1024;
600*2b54f0dbSXin Li 						if (chipset->model == 450 && cluster_id == 0) {
601*2b54f0dbSXin Li 							/* Snapdragon 450: 1M L2 for big cluster */
602*2b54f0dbSXin Li 							l2_size = 1024 * 1024;
603*2b54f0dbSXin Li 						}
604*2b54f0dbSXin Li 						break;
605*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_hisilicon_hi:
606*2b54f0dbSXin Li 						l1_size = 32 * 1024;
607*2b54f0dbSXin Li 						l2_size = 512 * 1024;
608*2b54f0dbSXin Li 						break;
609*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_hisilicon_kirin:
610*2b54f0dbSXin Li 						l1_size = 32 * 1024;
611*2b54f0dbSXin Li 						switch (chipset->model) {
612*2b54f0dbSXin Li 							case 970: /* Kirin 970 */
613*2b54f0dbSXin Li 								l2_size = 1024 * 1024;
614*2b54f0dbSXin Li 								break;
615*2b54f0dbSXin Li 							default:
616*2b54f0dbSXin Li 								l2_size = 512 * 1024;
617*2b54f0dbSXin Li 								break;
618*2b54f0dbSXin Li 						}
619*2b54f0dbSXin Li 						break;
620*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_mediatek_mt:
621*2b54f0dbSXin Li 						switch (chipset->model) {
622*2b54f0dbSXin Li 							case 8173:
623*2b54f0dbSXin Li 								l1_size = 32 * 1024;
624*2b54f0dbSXin Li 								l2_size = 512 * 1024;
625*2b54f0dbSXin Li 								break;
626*2b54f0dbSXin Li 						}
627*2b54f0dbSXin Li 						break;
628*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_rockchip_rk:
629*2b54f0dbSXin Li 						l1_size = 32 * 1024;
630*2b54f0dbSXin Li 						switch (chipset->model) {
631*2b54f0dbSXin Li 							case 3368:
632*2b54f0dbSXin Li 								if (cluster_id == 0) {
633*2b54f0dbSXin Li 									 /* RK3368: 512 KB L2 for the big cores */
634*2b54f0dbSXin Li 									l2_size = 512 * 1024;
635*2b54f0dbSXin Li 								}
636*2b54f0dbSXin Li 								break;
637*2b54f0dbSXin Li 						}
638*2b54f0dbSXin Li 						break;
639*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_broadcom_bcm:
640*2b54f0dbSXin Li 						switch (chipset->model) {
641*2b54f0dbSXin Li 							case 2837: /* BCM2837 */
642*2b54f0dbSXin Li 								l2_size = 512 * 1024;
643*2b54f0dbSXin Li 								break;
644*2b54f0dbSXin Li 						}
645*2b54f0dbSXin Li 						break;
646*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_samsung_exynos:
647*2b54f0dbSXin Li 						l1_size = 32 * 1024;
648*2b54f0dbSXin Li 						break;
649*2b54f0dbSXin Li 					default:
650*2b54f0dbSXin Li 						/* Silence compiler warning about unhandled enum values */
651*2b54f0dbSXin Li 						break;
652*2b54f0dbSXin Li 				}
653*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
654*2b54f0dbSXin Li 					.size = l1_size,
655*2b54f0dbSXin Li 					.associativity = 2,
656*2b54f0dbSXin Li 					.line_size = 64
657*2b54f0dbSXin Li 				};
658*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
659*2b54f0dbSXin Li 					.size = l1_size,
660*2b54f0dbSXin Li 					.associativity = 4,
661*2b54f0dbSXin Li 					.line_size = 64
662*2b54f0dbSXin Li 				};
663*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
664*2b54f0dbSXin Li 					.size = l2_size,
665*2b54f0dbSXin Li 					.associativity = 16,
666*2b54f0dbSXin Li 					.line_size = 64
667*2b54f0dbSXin Li 				};
668*2b54f0dbSXin Li 			}
669*2b54f0dbSXin Li 			break;
670*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a55r0:
671*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a55:
672*2b54f0dbSXin Li 			/*
673*2b54f0dbSXin Li 			 * ARM Cortex-A55 Core Technical Reference Manual
674*2b54f0dbSXin Li 			 * A6.1. About the L1 memory system
675*2b54f0dbSXin Li 			 *   The Cortex®-A55 core's L1 memory system enhances core performance and power efficiency.
676*2b54f0dbSXin Li 			 *   It consists of separate instruction and data caches. You can configure instruction and data caches
677*2b54f0dbSXin Li 			 *   independently during implementation to sizes of 16KB, 32KB, or 64KB.
678*2b54f0dbSXin Li 			 *
679*2b54f0dbSXin Li 			 *   L1 instruction-side memory system
680*2b54f0dbSXin Li 			 *   The L1 instruction-side memory system provides an instruction stream to the DPU. Its key features are:
681*2b54f0dbSXin Li 			 *    - 64-byte instruction side cache line length.
682*2b54f0dbSXin Li 			 *    - 4-way set associative L1 instruction cache.
683*2b54f0dbSXin Li 			 *
684*2b54f0dbSXin Li 			 *   L1 data-side memory system
685*2b54f0dbSXin Li 			 *    - 64-byte data side cache line length.
686*2b54f0dbSXin Li 			 *    - 4-way set associative L1 data cache.
687*2b54f0dbSXin Li 			 *
688*2b54f0dbSXin Li 			 * A7.1 About the L2 memory system
689*2b54f0dbSXin Li 			 *   The Cortex-A55 L2 memory system is required to interface the Cortex-A55 cores to the L3 memory system.
690*2b54f0dbSXin Li 			 *   The L2 memory subsystem consists of:
691*2b54f0dbSXin Li 			 *    - An optional 4-way, set-associative L2 cache with a configurable size of 64KB, 128KB or 256KB. Cache
692*2b54f0dbSXin Li 			 *      lines have a fixed length of 64 bytes.
693*2b54f0dbSXin Li 			 *
694*2b54f0dbSXin Li 			 *   The main features of the L2 memory system are:
695*2b54f0dbSXin Li 			 *    - Strictly exclusive with L1 data cache.
696*2b54f0dbSXin Li 			 *    - Pseudo-inclusive with L1 instruction cache.
697*2b54f0dbSXin Li 			 *    - Private per-core unified L2 cache.
698*2b54f0dbSXin Li 			 *
699*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
700*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | L3 cache | Reference  |
701*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
702*2b54f0dbSXin Li 			 *  | Snapdragon 845     | 4(+4) |    32K    |    32K    |    128K   |    2M    | [1], sysfs |
703*2b54f0dbSXin Li 			 *  | Exynos 9810        | 4(+4) |     ?     |     ?     |    None   |   512K   |     [2]    |
704*2b54f0dbSXin Li 			 *  | Kirin 980          | 4(+4) |    32K    |    32K    |    128K   |    4M    |     [3]    |
705*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
706*2b54f0dbSXin Li 			 *
707*2b54f0dbSXin Li 			 * [1] https://www.anandtech.com/show/12114/qualcomm-announces-snapdragon-845-soc
708*2b54f0dbSXin Li 			 * [2] https://www.anandtech.com/show/12478/exynos-9810-handson-awkward-first-results
709*2b54f0dbSXin Li 			 * [3] https://en.wikichip.org/wiki/hisilicon/kirin/980
710*2b54f0dbSXin Li 			 */
711*2b54f0dbSXin Li 			if (midr_is_qualcomm_cortex_a55_silver(midr)) {
712*2b54f0dbSXin Li 				/* Qualcomm-modified Cortex-A55 in Snapdragon 670 / 710 / 845 */
713*2b54f0dbSXin Li 				uint32_t l3_size = 1024 * 1024;
714*2b54f0dbSXin Li 				switch (chipset->series) {
715*2b54f0dbSXin Li 					case cpuinfo_arm_chipset_series_qualcomm_snapdragon:
716*2b54f0dbSXin Li 						/* Snapdragon 845: 2M L3 cache */
717*2b54f0dbSXin Li 						if (chipset->model == 845) {
718*2b54f0dbSXin Li 							l3_size = 2 * 1024 * 1024;
719*2b54f0dbSXin Li 						}
720*2b54f0dbSXin Li 						break;
721*2b54f0dbSXin Li 					default:
722*2b54f0dbSXin Li 						break;
723*2b54f0dbSXin Li 				}
724*2b54f0dbSXin Li 
725*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
726*2b54f0dbSXin Li 					.size = 32 * 1024,
727*2b54f0dbSXin Li 					.associativity = 4,
728*2b54f0dbSXin Li 					.line_size = 64,
729*2b54f0dbSXin Li 				};
730*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
731*2b54f0dbSXin Li 					.size = 32 * 1024,
732*2b54f0dbSXin Li 					.associativity = 4,
733*2b54f0dbSXin Li 					.line_size = 64,
734*2b54f0dbSXin Li 				};
735*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
736*2b54f0dbSXin Li 					.size = 128 * 1024,
737*2b54f0dbSXin Li 					.associativity = 4,
738*2b54f0dbSXin Li 					.line_size = 64,
739*2b54f0dbSXin Li 				};
740*2b54f0dbSXin Li 				*l3 = (struct cpuinfo_cache) {
741*2b54f0dbSXin Li 					.size = l3_size,
742*2b54f0dbSXin Li 					.associativity = 16,
743*2b54f0dbSXin Li 					.line_size = 64,
744*2b54f0dbSXin Li 				};
745*2b54f0dbSXin Li 			} else {
746*2b54f0dbSXin Li 				/* Standard Cortex-A55 */
747*2b54f0dbSXin Li 
748*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
749*2b54f0dbSXin Li 					.size = 32 * 1024,
750*2b54f0dbSXin Li 					.associativity = 4,
751*2b54f0dbSXin Li 					.line_size = 64,
752*2b54f0dbSXin Li 				};
753*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
754*2b54f0dbSXin Li 					.size = 32 * 1024,
755*2b54f0dbSXin Li 					.associativity = 4,
756*2b54f0dbSXin Li 					.line_size = 64,
757*2b54f0dbSXin Li 				};
758*2b54f0dbSXin Li 				if (chipset->series == cpuinfo_arm_chipset_series_samsung_exynos) {
759*2b54f0dbSXin Li 					*l2 = (struct cpuinfo_cache) {
760*2b54f0dbSXin Li 						.size = 512 * 1024,
761*2b54f0dbSXin Li 						/* DynamIQ */
762*2b54f0dbSXin Li 						.associativity = 16,
763*2b54f0dbSXin Li 						.line_size = 64,
764*2b54f0dbSXin Li 					};
765*2b54f0dbSXin Li 				} else {
766*2b54f0dbSXin Li 					uint32_t l3_size = 1024 * 1024;
767*2b54f0dbSXin Li 					switch (chipset->series) {
768*2b54f0dbSXin Li 						case cpuinfo_arm_chipset_series_hisilicon_kirin:
769*2b54f0dbSXin Li 							/* Kirin 980: 4M L3 cache */
770*2b54f0dbSXin Li 							if (chipset->model == 980) {
771*2b54f0dbSXin Li 								l3_size = 4 * 1024 * 1024;
772*2b54f0dbSXin Li 							}
773*2b54f0dbSXin Li 							break;
774*2b54f0dbSXin Li 						default:
775*2b54f0dbSXin Li 							break;
776*2b54f0dbSXin Li 					}
777*2b54f0dbSXin Li 					*l2 = (struct cpuinfo_cache) {
778*2b54f0dbSXin Li 						.size = 128 * 1024,
779*2b54f0dbSXin Li 						.associativity = 4,
780*2b54f0dbSXin Li 						.line_size = 64,
781*2b54f0dbSXin Li 					};
782*2b54f0dbSXin Li 					*l3 = (struct cpuinfo_cache) {
783*2b54f0dbSXin Li 						.size = l3_size,
784*2b54f0dbSXin Li 						/* DynamIQ */
785*2b54f0dbSXin Li 						.associativity = 16,
786*2b54f0dbSXin Li 						.line_size = 64,
787*2b54f0dbSXin Li 					};
788*2b54f0dbSXin Li 				}
789*2b54f0dbSXin Li 			}
790*2b54f0dbSXin Li 			break;
791*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a57:
792*2b54f0dbSXin Li 			/*
793*2b54f0dbSXin Li 			 * ARM Cortex-A57 MPCore Processor Technical Reference Manual:
794*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
795*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches.
796*2b54f0dbSXin Li 			 *
797*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following features:
798*2b54f0dbSXin Li 			 *    - 48KB 3-way set-associative instruction cache.
799*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
800*2b54f0dbSXin Li 			 *
801*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
802*2b54f0dbSXin Li 			 *    - 32KB 2-way set-associative data cache.
803*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
804*2b54f0dbSXin Li 			 *
805*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
806*2b54f0dbSXin Li 			 *   The features of the L2 memory system include:
807*2b54f0dbSXin Li 			 *    - Configurable L2 cache size of 512KB, 1MB, and 2MB.
808*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
809*2b54f0dbSXin Li 			 *    - 16-way set-associative cache structure.
810*2b54f0dbSXin Li 			 *    - Inclusion property with L1 data caches.
811*2b54f0dbSXin Li 			 *
812*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
813*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
814*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
815*2b54f0dbSXin Li 			 *  | Snapdragon 810     | 4(+4) |    32K    |    48K    |    2M     |    [1]    |
816*2b54f0dbSXin Li 			 *  | Exynos 7420        | 4(+4) |    32K    |    48K    |    2M     |    [2]    |
817*2b54f0dbSXin Li 			 *  | Jetson TX1         |   4   |    32K    |    48K    |    2M     |    [3]    |
818*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
819*2b54f0dbSXin Li 			 *
820*2b54f0dbSXin Li 			 * [1] http://www.anandtech.com/show/9837/snapdragon-820-preview
821*2b54f0dbSXin Li 			 * [2] http://www.anandtech.com/show/9330/exynos-7420-deep-dive/2
822*2b54f0dbSXin Li 			 * [3] https://devblogs.nvidia.com/parallelforall/jetson-tx2-delivers-twice-intelligence-edge/
823*2b54f0dbSXin Li 			 */
824*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
825*2b54f0dbSXin Li 				.size = 48 * 1024,
826*2b54f0dbSXin Li 				.associativity = 3,
827*2b54f0dbSXin Li 				.line_size = 64
828*2b54f0dbSXin Li 			};
829*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
830*2b54f0dbSXin Li 				.size = 32 * 1024,
831*2b54f0dbSXin Li 				.associativity = 2,
832*2b54f0dbSXin Li 				.line_size = 64
833*2b54f0dbSXin Li 			};
834*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
835*2b54f0dbSXin Li 				.size = cluster_cores * 512 * 1024,
836*2b54f0dbSXin Li 				.associativity = 16,
837*2b54f0dbSXin Li 				.line_size = 64,
838*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE
839*2b54f0dbSXin Li 			};
840*2b54f0dbSXin Li 			break;
841*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a65:
842*2b54f0dbSXin Li 		{
843*2b54f0dbSXin Li 			/*
844*2b54f0dbSXin Li 			 * ARM Cortex‑A65 Core Technical Reference Manual
845*2b54f0dbSXin Li 			 * A6.1. About the L1 memory system
846*2b54f0dbSXin Li 			 *   The L1 memory system enhances the performance and power efficiency in the Cortex‑A65 core.
847*2b54f0dbSXin Li 			 *   It consists of separate instruction and data caches. You can configure instruction and data caches
848*2b54f0dbSXin Li 			 *   independently during implementation to sizes of 32KB or 64KB.
849*2b54f0dbSXin Li 			 *
850*2b54f0dbSXin Li 			 *   L1 instruction-side memory system
851*2b54f0dbSXin Li 			 *   The L1 instruction-side memory system provides an instruction stream to the DPU. Its key features are:
852*2b54f0dbSXin Li 			 *    - 64-byte instruction side cache line length.
853*2b54f0dbSXin Li 			 *    - 4-way set associative L1 instruction cache.
854*2b54f0dbSXin Li 			 *
855*2b54f0dbSXin Li 			 *   L1 data-side memory system
856*2b54f0dbSXin Li 			 *    - 64-byte data side cache line length.
857*2b54f0dbSXin Li 			 *    - 4-way set associative L1 data cache.
858*2b54f0dbSXin Li 			 *
859*2b54f0dbSXin Li 			 * A7.1 About the L2 memory system
860*2b54f0dbSXin Li 			 *   The Cortex‑A65 L2 memory system is required to interface the Cortex‑A65 cores to the L3 memory system.
861*2b54f0dbSXin Li 			 *   The L2 memory subsystem consists of:
862*2b54f0dbSXin Li 			 *    - An optional 4-way, set-associative L2 cache with a configurable size of 64KB, 128KB, or 256KB.
863*2b54f0dbSXin Li 			 *      Cache lines have a fixed length of 64 bytes.
864*2b54f0dbSXin Li 			 *
865*2b54f0dbSXin Li 			 *   The main features of the L2 memory system are:
866*2b54f0dbSXin Li 			 *    - Strictly exclusive with L1 data cache.
867*2b54f0dbSXin Li 			 *    - Pseudo-inclusive with L1 instruction cache.
868*2b54f0dbSXin Li 			 *    - Private per-core unified L2 cache.
869*2b54f0dbSXin Li 			 */
870*2b54f0dbSXin Li 			const uint32_t l1_size = 32 * 1024;
871*2b54f0dbSXin Li 			const uint32_t l2_size = 128 * 1024;
872*2b54f0dbSXin Li 			const uint32_t l3_size = 512 * 1024;
873*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
874*2b54f0dbSXin Li 				.size = l1_size,
875*2b54f0dbSXin Li 				.associativity = 4,
876*2b54f0dbSXin Li 				.line_size = 64,
877*2b54f0dbSXin Li 			};
878*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
879*2b54f0dbSXin Li 				.size = l1_size,
880*2b54f0dbSXin Li 				.associativity = 4,
881*2b54f0dbSXin Li 				.line_size = 64,
882*2b54f0dbSXin Li 			};
883*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
884*2b54f0dbSXin Li 				.size = l2_size,
885*2b54f0dbSXin Li 				.associativity = 4,
886*2b54f0dbSXin Li 				.line_size = 64,
887*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE
888*2b54f0dbSXin Li 			};
889*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
890*2b54f0dbSXin Li 				.size = l3_size,
891*2b54f0dbSXin Li 				/* DynamIQ */
892*2b54f0dbSXin Li 				.associativity = 16,
893*2b54f0dbSXin Li 				.line_size = 64,
894*2b54f0dbSXin Li 			};
895*2b54f0dbSXin Li 			break;
896*2b54f0dbSXin Li 		}
897*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a72:
898*2b54f0dbSXin Li 		{
899*2b54f0dbSXin Li 			/*
900*2b54f0dbSXin Li 			 * ARM Cortex-A72 MPCore Processor Technical Reference Manual
901*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
902*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches.
903*2b54f0dbSXin Li 			 *
904*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following features:
905*2b54f0dbSXin Li 			 *    - 48KB 3-way set-associative instruction cache.
906*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
907*2b54f0dbSXin Li 			 *
908*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
909*2b54f0dbSXin Li 			 *    - 32KB 2-way set-associative data cache.
910*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
911*2b54f0dbSXin Li 			 *
912*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
913*2b54f0dbSXin Li 			 *   The features of the L2 memory system include:
914*2b54f0dbSXin Li 			 *    - Configurable L2 cache size of 512KB, 1MB, 2MB and 4MB.
915*2b54f0dbSXin Li 			 *    - Fixed line length of 64 bytes.
916*2b54f0dbSXin Li 			 *    - Banked pipeline structures.
917*2b54f0dbSXin Li 			 *    - Inclusion property with L1 data caches.
918*2b54f0dbSXin Li 			 *    - 16-way set-associative cache structure.
919*2b54f0dbSXin Li 			 *
920*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+------------+-----------+
921*2b54f0dbSXin Li 			 *  | Processor model     | Cores   | L1D cache | L1I cache | L2 cache   | Reference |
922*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+------------+-----------+
923*2b54f0dbSXin Li 			 *  | Snapdragon 650      |  2(+4)  | 32K(+32K) | 48K(+32K) |  1M(+512K) |    [1]    |
924*2b54f0dbSXin Li 			 *  | Snapdragon 652      |  4(+4)  | 32K(+32K) | 48K(+32K) |  1M(+512K) |    [2]    |
925*2b54f0dbSXin Li 			 *  | Snapdragon 653      |  4(+4)  | 32K(+32K) | 48K(+32K) |  1M(+512K) |    [3]    |
926*2b54f0dbSXin Li 			 *  | HiSilicon Kirin 950 |  4(+4)  |  32K+32K  |  48K+32K  |     ?      |           |
927*2b54f0dbSXin Li 			 *  | HiSilicon Kirin 955 |  4(+4)  |  32K+32K  |  48K+32K  |     ?      |           |
928*2b54f0dbSXin Li 			 *  | MediaTek MT8173C    |  2(+2)  | 32K(+32K) | 48K(+32K) |  1M(+512K) |   sysfs   |
929*2b54f0dbSXin Li 			 *  | MediaTek Helio X20  | 2(+4+4) |     ?     |     ?     |     ?      |           |
930*2b54f0dbSXin Li 			 *  | MediaTek Helio X23  | 2(+4+4) |     ?     |     ?     |     ?      |           |
931*2b54f0dbSXin Li 			 *  | MediaTek Helio X25  | 2(+4+4) |     ?     |     ?     |     ?      |           |
932*2b54f0dbSXin Li 			 *  | MediaTek Helio X27  | 2(+4+4) |     ?     |     ?     |     ?      |           |
933*2b54f0dbSXin Li 			 *  | Broadcom BCM2711    |    4    |    32K    |    48K    |     1M     |    [4]    |
934*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+------------+-----------+
935*2b54f0dbSXin Li 			 *
936*2b54f0dbSXin Li 			 * [1] http://pdadb.net/index.php?m=processor&id=578&c=qualcomm_snapdragon_618_msm8956__snapdragon_650
937*2b54f0dbSXin Li 			 * [2] http://pdadb.net/index.php?m=processor&id=667&c=qualcomm_snapdragon_620_apq8076__snapdragon_652
938*2b54f0dbSXin Li 			 * [3] http://pdadb.net/index.php?m=processor&id=692&c=qualcomm_snapdragon_653_msm8976sg__msm8976_pro
939*2b54f0dbSXin Li 			 * [4] https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711/README.md
940*2b54f0dbSXin Li 			 */
941*2b54f0dbSXin Li 			uint32_t l2_size;
942*2b54f0dbSXin Li 			switch (chipset->series) {
943*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_series_hisilicon_kirin:
944*2b54f0dbSXin Li 					l2_size = 2 * 1024 * 1024;
945*2b54f0dbSXin Li 					break;
946*2b54f0dbSXin Li 				default:
947*2b54f0dbSXin Li 					l2_size = 1024 * 1024;
948*2b54f0dbSXin Li 					break;
949*2b54f0dbSXin Li 			}
950*2b54f0dbSXin Li 
951*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
952*2b54f0dbSXin Li 				.size = 48 * 1024,
953*2b54f0dbSXin Li 				.associativity = 3,
954*2b54f0dbSXin Li 				.line_size = 64
955*2b54f0dbSXin Li 			};
956*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
957*2b54f0dbSXin Li 				.size = 32 * 1024,
958*2b54f0dbSXin Li 				.associativity = 2,
959*2b54f0dbSXin Li 				.line_size = 64
960*2b54f0dbSXin Li 			};
961*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
962*2b54f0dbSXin Li 				.size = l2_size,
963*2b54f0dbSXin Li 				.associativity = 16,
964*2b54f0dbSXin Li 				.line_size = 64,
965*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE
966*2b54f0dbSXin Li 			};
967*2b54f0dbSXin Li 			break;
968*2b54f0dbSXin Li 		}
969*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a73:
970*2b54f0dbSXin Li 		{
971*2b54f0dbSXin Li 			/*
972*2b54f0dbSXin Li 			 * ARM Cortex‑A73 MPCore Processor Technical Reference Manual
973*2b54f0dbSXin Li 			 * 6.1. About the L1 memory system
974*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches.
975*2b54f0dbSXin Li 			 *   The size of the instruction cache is 64KB.
976*2b54f0dbSXin Li 			 *   The size of the data cache is configurable to either 32KB or 64KB.
977*2b54f0dbSXin Li 			 *
978*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following key features:
979*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), four-way set-associative instruction cache.
980*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
981*2b54f0dbSXin Li 			 *
982*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
983*2b54f0dbSXin Li 			 *    - ...the data cache behaves like an eight-way set associative PIPT cache (for 32KB configurations)
984*2b54f0dbSXin Li 			 *      and a 16-way set associative PIPT cache (for 64KB configurations).
985*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
986*2b54f0dbSXin Li 			 *
987*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
988*2b54f0dbSXin Li 			 *   The L2 memory system consists of:
989*2b54f0dbSXin Li 			 *    - A tightly-integrated L2 cache with:
990*2b54f0dbSXin Li 			 *      - A configurable size of 256KB, 512KB, 1MB, 2MB, 4MB, or 8MB.
991*2b54f0dbSXin Li 			 *      - A 16-way, set-associative structure.
992*2b54f0dbSXin Li 			 *      - A fixed line length of 64 bytes.
993*2b54f0dbSXin Li 			 *
994*2b54f0dbSXin Li 			 * The ARM Cortex A73 - Artemis Unveiled [1]
995*2b54f0dbSXin Li 			 *   "ARM still envisions that most vendors will choose to use configurations of 1 to
996*2b54f0dbSXin Li 			 *    2MB in consumer products. The L2 cache is inclusive of the L1 cache. "
997*2b54f0dbSXin Li 			 *
998*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+-----------+-----------+
999*2b54f0dbSXin Li 			 *  | Processor model     | Cores   | L1D cache | L1I cache | L2 cache  | Reference |
1000*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+-----------+-----------+
1001*2b54f0dbSXin Li 			 *  | HiSilicon Kirin 960 |  4(+4)  |  64K+32K  |  64K+32K  |     ?     |    [2]    |
1002*2b54f0dbSXin Li 			 *  | MediaTek Helio X30  | 2(+4+4) |     ?     |  64K+ ?   |     ?     |           |
1003*2b54f0dbSXin Li 			 *  | Snapdragon 636      |  4(+4)  | 64K(+32K) | 64K(+32K) |  1M(+1M)  |   sysfs   |
1004*2b54f0dbSXin Li 			 *  | Snapdragon 660      |  4(+4)  |  64K+32K  |  64K+32K  |  1M(+1M)  |    [3]    |
1005*2b54f0dbSXin Li 			 *  | Snapdragon 835      |  4(+4)  |  64K+32K  |  64K+32K  |  2M(+1M)  |   sysfs   |
1006*2b54f0dbSXin Li 			 *  +---------------------+---------+-----------+-----------+-----------+-----------+
1007*2b54f0dbSXin Li 			 *
1008*2b54f0dbSXin Li 			 * [1] http://www.anandtech.com/show/10347/arm-cortex-a73-artemis-unveiled/2
1009*2b54f0dbSXin Li 			 * [2] http://www.anandtech.com/show/11088/hisilicon-kirin-960-performance-and-power/3
1010*2b54f0dbSXin Li 			 * [3] https://arstechnica.com/gadgets/2017/05/qualcomms-snapdragon-660-and-630-bring-more-high-end-features-to-midrange-chips/
1011*2b54f0dbSXin Li 			 */
1012*2b54f0dbSXin Li 			uint32_t l1d_size = 32 * 1024;
1013*2b54f0dbSXin Li 			uint32_t l2_size = 512 * 1024;
1014*2b54f0dbSXin Li 			switch (chipset->series) {
1015*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_series_hisilicon_kirin:
1016*2b54f0dbSXin Li 					l1d_size = 64 * 1024;
1017*2b54f0dbSXin Li 					l2_size = 2 * 1024 * 1024;
1018*2b54f0dbSXin Li 					break;
1019*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_series_mediatek_mt:
1020*2b54f0dbSXin Li 					l1d_size = 64 * 1024;
1021*2b54f0dbSXin Li 					l2_size = 1 * 1024 * 1024; /* TODO: verify assumption */
1022*2b54f0dbSXin Li 					break;
1023*2b54f0dbSXin Li 				default:
1024*2b54f0dbSXin Li 					switch (midr) {
1025*2b54f0dbSXin Li 						case UINT32_C(0x51AF8001): /* Kryo 280 Gold */
1026*2b54f0dbSXin Li 							l1d_size = 64 * 1024;
1027*2b54f0dbSXin Li 							l2_size = 2 * 1024 * 1024;
1028*2b54f0dbSXin Li 							break;
1029*2b54f0dbSXin Li 						case UINT32_C(0x51AF8002): /* Kryo 260 Gold */
1030*2b54f0dbSXin Li 							l1d_size = 64 * 1024;
1031*2b54f0dbSXin Li 							l2_size = 1 * 1024 * 1024;
1032*2b54f0dbSXin Li 							break;
1033*2b54f0dbSXin Li 					}
1034*2b54f0dbSXin Li 			}
1035*2b54f0dbSXin Li 
1036*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1037*2b54f0dbSXin Li 				.size = 64 * 1024,
1038*2b54f0dbSXin Li 				.associativity = 4,
1039*2b54f0dbSXin Li 				.line_size = 64
1040*2b54f0dbSXin Li 			};
1041*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1042*2b54f0dbSXin Li 				.size = l1d_size,
1043*2b54f0dbSXin Li 				.associativity = (l1d_size >> 12),
1044*2b54f0dbSXin Li 				.line_size = 64
1045*2b54f0dbSXin Li 			};
1046*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1047*2b54f0dbSXin Li 				.size = l2_size,
1048*2b54f0dbSXin Li 				.associativity = 16,
1049*2b54f0dbSXin Li 				.line_size = 64,
1050*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE
1051*2b54f0dbSXin Li 			};
1052*2b54f0dbSXin Li 			break;
1053*2b54f0dbSXin Li 		}
1054*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a75:
1055*2b54f0dbSXin Li 		{
1056*2b54f0dbSXin Li 			/*
1057*2b54f0dbSXin Li 			 * ARM Cortex-A75 Core Technical Reference Manual
1058*2b54f0dbSXin Li 			 * A6.1. About the L1 memory system
1059*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. Both have a fixed size of 64KB.
1060*2b54f0dbSXin Li 			 *
1061*2b54f0dbSXin Li 			 * A6.1.1 L1 instruction-side memory system
1062*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following key features:
1063*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), four-way set-associative instruction cache.
1064*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1065*2b54f0dbSXin Li 			 *
1066*2b54f0dbSXin Li 			 * A6.1.2 L1 data-side memory system
1067*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
1068*2b54f0dbSXin Li 			 *    - Physically Indexed, Physically Tagged (PIPT), 16-way set-associative L1 data cache.
1069*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1070*2b54f0dbSXin Li 			 *    - Pseudo-random cache replacement policy.
1071*2b54f0dbSXin Li 			 *
1072*2b54f0dbSXin Li 			 * A7.1 About the L2 memory system
1073*2b54f0dbSXin Li 			 *   The L2 memory subsystem consist of:
1074*2b54f0dbSXin Li 			 *    - An 8-way set associative L2 cache with a configurable size of 256KB or 512KB.
1075*2b54f0dbSXin Li 			 *      Cache lines have a fixed length of 64 bytes.
1076*2b54f0dbSXin Li 			 *
1077*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1078*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | L3 cache | Reference  |
1079*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1080*2b54f0dbSXin Li 			 *  | Snapdragon 845     | 4(+4) |    64K    |    64K    |    256K   |    2M    | [1], sysfs |
1081*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1082*2b54f0dbSXin Li 			 *
1083*2b54f0dbSXin Li 			 * [1] https://www.anandtech.com/show/12114/qualcomm-announces-snapdragon-845-soc
1084*2b54f0dbSXin Li 			 */
1085*2b54f0dbSXin Li 			uint32_t l3_size = 1024 * 1024;
1086*2b54f0dbSXin Li 			switch (chipset->series) {
1087*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_series_qualcomm_snapdragon:
1088*2b54f0dbSXin Li 					/* Snapdragon 845: 2M L3 cache */
1089*2b54f0dbSXin Li 					if (chipset->model == 845) {
1090*2b54f0dbSXin Li 						l3_size = 2 * 1024 * 1024;
1091*2b54f0dbSXin Li 					}
1092*2b54f0dbSXin Li 					break;
1093*2b54f0dbSXin Li 				default:
1094*2b54f0dbSXin Li 					break;
1095*2b54f0dbSXin Li 			}
1096*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1097*2b54f0dbSXin Li 				.size = 64 * 1024,
1098*2b54f0dbSXin Li 				.associativity = 4,
1099*2b54f0dbSXin Li 				.line_size = 64
1100*2b54f0dbSXin Li 			};
1101*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1102*2b54f0dbSXin Li 				.size = 64 * 1024,
1103*2b54f0dbSXin Li 				.associativity = 16,
1104*2b54f0dbSXin Li 				.line_size = 64
1105*2b54f0dbSXin Li 			};
1106*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1107*2b54f0dbSXin Li 				.size = 256 * 1024,
1108*2b54f0dbSXin Li 				.associativity = 8,
1109*2b54f0dbSXin Li 				.line_size = 64
1110*2b54f0dbSXin Li 			};
1111*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1112*2b54f0dbSXin Li 				.size = l3_size,
1113*2b54f0dbSXin Li 				.associativity = 16,
1114*2b54f0dbSXin Li 				.line_size = 64
1115*2b54f0dbSXin Li 			};
1116*2b54f0dbSXin Li 			break;
1117*2b54f0dbSXin Li 		}
1118*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a76:
1119*2b54f0dbSXin Li 		{
1120*2b54f0dbSXin Li 			/*
1121*2b54f0dbSXin Li 			 * ARM Cortex-A76 Core Technical Reference Manual
1122*2b54f0dbSXin Li 			 * A6.1. About the L1 memory system
1123*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. Both have a fixed size of 64KB.
1124*2b54f0dbSXin Li 			 *
1125*2b54f0dbSXin Li 			 * A6.1.1 L1 instruction-side memory system
1126*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following key features:
1127*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1128*2b54f0dbSXin Li 			 *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1129*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1130*2b54f0dbSXin Li 			 *
1131*2b54f0dbSXin Li 			 * A6.1.2 L1 data-side memory system
1132*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
1133*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1134*2b54f0dbSXin Li 			 *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1135*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1136*2b54f0dbSXin Li 			 *    - Pseudo-LRU cache replacement policy.
1137*2b54f0dbSXin Li 			 *
1138*2b54f0dbSXin Li 			 * A7.1 About the L2 memory system
1139*2b54f0dbSXin Li 			 *   The L2 memory subsystem consist of:
1140*2b54f0dbSXin Li 			 *    - An 8-way set associative L2 cache with a configurable size of 128KB, 256KB or 512KB.
1141*2b54f0dbSXin Li 			 *      Cache lines have a fixed length of 64 bytes.
1142*2b54f0dbSXin Li 			 *    - Strictly inclusive with L1 data cache. Weakly inclusive with L1 instruction cache.
1143*2b54f0dbSXin Li 			 *    - Dynamic biased replacement policy.
1144*2b54f0dbSXin Li 			 *    - Modified Exclusive Shared Invalid (MESI) coherency.
1145*2b54f0dbSXin Li 			 *
1146*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1147*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | L3 cache | Reference  |
1148*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1149*2b54f0dbSXin Li 			 *  | Kirin 980          | 4(+4) |    64K    |    64K    |    512K   |    4M    |  [1], [2]  |
1150*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1151*2b54f0dbSXin Li 			 *
1152*2b54f0dbSXin Li 			 * [1] https://www.anandtech.com/show/13298/hisilicon-announces-the-kirin-980-first-a76-g76-on-7nm
1153*2b54f0dbSXin Li 			 * [2] https://en.wikichip.org/wiki/hisilicon/kirin/980
1154*2b54f0dbSXin Li 			 */
1155*2b54f0dbSXin Li 			uint32_t l2_size = 256 * 1024;
1156*2b54f0dbSXin Li 			uint32_t l3_size = 1024 * 1024;
1157*2b54f0dbSXin Li 			switch (chipset->series) {
1158*2b54f0dbSXin Li 				case cpuinfo_arm_chipset_series_hisilicon_kirin:
1159*2b54f0dbSXin Li 					/* Kirin 980: 512K L2 cache + 4M L3 cache */
1160*2b54f0dbSXin Li 					if (chipset->model == 980) {
1161*2b54f0dbSXin Li 						l2_size = 512 * 1024;
1162*2b54f0dbSXin Li 						l3_size = 4 * 1024 * 1024;
1163*2b54f0dbSXin Li 					}
1164*2b54f0dbSXin Li 					break;
1165*2b54f0dbSXin Li 				default:
1166*2b54f0dbSXin Li 					break;
1167*2b54f0dbSXin Li 			}
1168*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1169*2b54f0dbSXin Li 				.size = 64 * 1024,
1170*2b54f0dbSXin Li 				.associativity = 4,
1171*2b54f0dbSXin Li 				.line_size = 64,
1172*2b54f0dbSXin Li 			};
1173*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1174*2b54f0dbSXin Li 				.size = 64 * 1024,
1175*2b54f0dbSXin Li 				.associativity = 4,
1176*2b54f0dbSXin Li 				.line_size = 64,
1177*2b54f0dbSXin Li 			};
1178*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1179*2b54f0dbSXin Li 				.size = l2_size,
1180*2b54f0dbSXin Li 				.associativity = 8,
1181*2b54f0dbSXin Li 				.line_size = 64,
1182*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE,
1183*2b54f0dbSXin Li 			};
1184*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1185*2b54f0dbSXin Li 				.size = l3_size,
1186*2b54f0dbSXin Li 				.associativity = 16,
1187*2b54f0dbSXin Li 				.line_size = 64,
1188*2b54f0dbSXin Li 			};
1189*2b54f0dbSXin Li 			break;
1190*2b54f0dbSXin Li 		}
1191*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a77:
1192*2b54f0dbSXin Li 		{
1193*2b54f0dbSXin Li 			/*
1194*2b54f0dbSXin Li 			 * ARM Cortex-A77 Core Technical Reference Manual
1195*2b54f0dbSXin Li 			 * A6.1. About the L1 memory system
1196*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. Both have a fixed size of 64KB.
1197*2b54f0dbSXin Li 			 *
1198*2b54f0dbSXin Li 			 * A6.1.1 L1 instruction-side memory system
1199*2b54f0dbSXin Li 			 *   The L1 instruction memory system has the following key features:
1200*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1201*2b54f0dbSXin Li 			 *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1202*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1203*2b54f0dbSXin Li 			 *
1204*2b54f0dbSXin Li 			 * A6.1.2 L1 data-side memory system
1205*2b54f0dbSXin Li 			 *   The L1 data memory system has the following features:
1206*2b54f0dbSXin Li 			 *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1207*2b54f0dbSXin Li 			 *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1208*2b54f0dbSXin Li 			 *    - Fixed cache line length of 64 bytes.
1209*2b54f0dbSXin Li 			 *    - Pseudo-LRU cache replacement policy.
1210*2b54f0dbSXin Li 			 *
1211*2b54f0dbSXin Li 			 * A7.1 About the L2 memory system
1212*2b54f0dbSXin Li 			 *   The L2 memory subsystem consist of:
1213*2b54f0dbSXin Li 			 *    - An 8-way set associative L2 cache with a configurable size of 128KB, 256KB or 512KB. Cache lines
1214*2b54f0dbSXin Li 			 *      have a fixed length of 64 bytes.
1215*2b54f0dbSXin Li 			 *    - Strictly inclusive with L1 data cache. Weakly inclusive with L1 instruction cache.
1216*2b54f0dbSXin Li 			 */
1217*2b54f0dbSXin Li 			const uint32_t l2_size = 256 * 1024;
1218*2b54f0dbSXin Li 			const uint32_t l3_size = 1024 * 1024;
1219*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1220*2b54f0dbSXin Li 				.size = 64 * 1024,
1221*2b54f0dbSXin Li 				.associativity = 4,
1222*2b54f0dbSXin Li 				.line_size = 64,
1223*2b54f0dbSXin Li 			};
1224*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1225*2b54f0dbSXin Li 				.size = 64 * 1024,
1226*2b54f0dbSXin Li 				.associativity = 4,
1227*2b54f0dbSXin Li 				.line_size = 64,
1228*2b54f0dbSXin Li 			};
1229*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1230*2b54f0dbSXin Li 				.size = l2_size,
1231*2b54f0dbSXin Li 				.associativity = 8,
1232*2b54f0dbSXin Li 				.line_size = 64,
1233*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE,
1234*2b54f0dbSXin Li 			};
1235*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1236*2b54f0dbSXin Li 				.size = l3_size,
1237*2b54f0dbSXin Li 				.associativity = 16,
1238*2b54f0dbSXin Li 				.line_size = 64,
1239*2b54f0dbSXin Li 			};
1240*2b54f0dbSXin Li 			break;
1241*2b54f0dbSXin Li 		}
1242*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_n1:
1243*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_v1:
1244*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_n2:
1245*2b54f0dbSXin Li 		{
1246*2b54f0dbSXin Li                         /*
1247*2b54f0dbSXin Li                          * ARM Neoverse-n1 Core Technical Reference Manual
1248*2b54f0dbSXin Li                          * A6.1. About the L1 memory system
1249*2b54f0dbSXin Li 			 *   The L1 memory system consists of separate instruction and data caches. Both have a fixed size of 64KB.
1250*2b54f0dbSXin Li                          *
1251*2b54f0dbSXin Li                          * A6.1.1 L1 instruction-side memory system
1252*2b54f0dbSXin Li                          *   The L1 instruction memory system has the following key features:
1253*2b54f0dbSXin Li                          *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1254*2b54f0dbSXin Li                          *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1255*2b54f0dbSXin Li                          *    - Fixed cache line length of 64 bytes.
1256*2b54f0dbSXin Li                          *
1257*2b54f0dbSXin Li                          * A6.1.2 L1 data-side memory system
1258*2b54f0dbSXin Li                          *   The L1 data memory system has the following features:
1259*2b54f0dbSXin Li                          *    - Virtually Indexed, Physically Tagged (VIPT), which behaves as a Physically Indexed,
1260*2b54f0dbSXin Li                          *      Physically Tagged (PIPT) 4-way set-associative L1 data cache.
1261*2b54f0dbSXin Li                          *    - Fixed cache line length of 64 bytes.
1262*2b54f0dbSXin Li                          *    - Pseudo-LRU cache replacement policy.
1263*2b54f0dbSXin Li                          *
1264*2b54f0dbSXin Li                          * A7.1 About the L2 memory system
1265*2b54f0dbSXin Li                          *   The L2 memory subsystem consist of:
1266*2b54f0dbSXin Li 			 *    - An 8-way set associative L2 cache with a configurable size of 256KB, 512KB, or 1024KB. Cache lines
1267*2b54f0dbSXin Li 			 *      have a fixed length of 64 bytes.
1268*2b54f0dbSXin Li                          *    - Strictly inclusive with L1 data cache.
1269*2b54f0dbSXin Li 			 *    - When configured with instruction cache hardware coherency, strictly inclusive with L1 instruction cache.
1270*2b54f0dbSXin Li 			 *    - When configured without instruction cache hardware coherency, weakly inclusive with L1 instruction cache.
1271*2b54f0dbSXin Li                          */
1272*2b54f0dbSXin Li 
1273*2b54f0dbSXin Li 			const uint32_t min_l2_size_KB= 256;
1274*2b54f0dbSXin Li 			const uint32_t min_l3_size_KB = 0;
1275*2b54f0dbSXin Li 
1276*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1277*2b54f0dbSXin Li 				.size = 64 * 1024,
1278*2b54f0dbSXin Li 				.associativity = 4,
1279*2b54f0dbSXin Li 				.line_size = 64,
1280*2b54f0dbSXin Li 			};
1281*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1282*2b54f0dbSXin Li 				.size = 64 * 1024,
1283*2b54f0dbSXin Li 				.associativity = 4,
1284*2b54f0dbSXin Li 				.line_size = 64,
1285*2b54f0dbSXin Li 			};
1286*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1287*2b54f0dbSXin Li 				.size = min_l2_size_KB * 1024,
1288*2b54f0dbSXin Li 				.associativity = 8,
1289*2b54f0dbSXin Li 				.line_size = 64,
1290*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE,
1291*2b54f0dbSXin Li 			};
1292*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1293*2b54f0dbSXin Li 				.size = min_l3_size_KB * 1024,
1294*2b54f0dbSXin Li 				.associativity = 16,
1295*2b54f0dbSXin Li 				.line_size = 64,
1296*2b54f0dbSXin Li 			};
1297*2b54f0dbSXin Li 			break;
1298*2b54f0dbSXin Li 		}
1299*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_8A__)
1300*2b54f0dbSXin Li 		case cpuinfo_uarch_scorpion:
1301*2b54f0dbSXin Li 			/*
1302*2b54f0dbSXin Li 			 * - "The CPU includes 32KB instruction and data caches as
1303*2b54f0dbSXin Li 			 *    well as a complete memory-management unit (MMU) suitable
1304*2b54f0dbSXin Li 			 *    for high-level operating systems. The CPU also has
1305*2b54f0dbSXin Li 			 *    256KB of SRAM that can be allocated in 64KB increments
1306*2b54f0dbSXin Li 			 *    to level-two (L2) cache or tightly coupled memory (TCM)." [1]
1307*2b54f0dbSXin Li 			 *    We interpret it as L2 cache being 4-way set-associative on single-core Scorpion.
1308*2b54f0dbSXin Li 			 * - L1 Data Cache = 32 KB. 32 B/line. [2]
1309*2b54f0dbSXin Li              * - L2 Cache = 256 KB. 128 B/line. [2]
1310*2b54f0dbSXin Li 			 * - 256 KB (single-core) or 512 KB (dual-core) L2 cache [3]
1311*2b54f0dbSXin Li 			 * - Single or dual-core configuration [3]
1312*2b54f0dbSXin Li 			 * - For L1 cache assume the same associativity as Krait
1313*2b54f0dbSXin Li 			 *
1314*2b54f0dbSXin Li 			 * [1] https://www.qualcomm.com/media/documents/files/linley-report-on-dual-core-snapdragon.pdf
1315*2b54f0dbSXin Li 			 * [2] http://www.7-cpu.com/cpu/Snapdragon.html
1316*2b54f0dbSXin Li 			 * [3] https://en.wikipedia.org/wiki/Scorpion_(CPU)
1317*2b54f0dbSXin Li 			 */
1318*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1319*2b54f0dbSXin Li 				.size = 32 * 1024,
1320*2b54f0dbSXin Li 				.associativity = 4,
1321*2b54f0dbSXin Li 				.line_size = 32
1322*2b54f0dbSXin Li 			};
1323*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1324*2b54f0dbSXin Li 				.size = 32 * 1024,
1325*2b54f0dbSXin Li 				.associativity = 4,
1326*2b54f0dbSXin Li 				.line_size = 32
1327*2b54f0dbSXin Li 			};
1328*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1329*2b54f0dbSXin Li 				.size = cluster_cores * 256 * 1024,
1330*2b54f0dbSXin Li 				.associativity = 4,
1331*2b54f0dbSXin Li 				.line_size = 128
1332*2b54f0dbSXin Li 			};
1333*2b54f0dbSXin Li 			break;
1334*2b54f0dbSXin Li 		case cpuinfo_uarch_krait:
1335*2b54f0dbSXin Li 			/*
1336*2b54f0dbSXin Li 			 * - L0 Data cache = 4 KB. 64 B/line, direct mapped [1]
1337*2b54f0dbSXin Li 			 * - L0 Instruction cache = 4 KB. [1]
1338*2b54f0dbSXin Li 			 * - L1 Data cache = 16 KB. 64 B/line, 4-way [1]
1339*2b54f0dbSXin Li 			 * - L1 Instruction cache = 16 KB, 4-way [1]
1340*2b54f0dbSXin Li 			 * - L2 Cache = 1 MB, 128 B/line, 8-way. Each core has fast access only to 512 KB of L2 cache. [1]
1341*2b54f0dbSXin Li 			 * - L2	= 1MB (dual core) or 2MB (quad core), 8-way set associative [2]
1342*2b54f0dbSXin Li 			 *
1343*2b54f0dbSXin Li 			 * [1] http://www.7-cpu.com/cpu/Krait.html
1344*2b54f0dbSXin Li 			 * [2] http://www.anandtech.com/show/4940/qualcomm-new-snapdragon-s4-msm8960-krait-architecture/2
1345*2b54f0dbSXin Li 			 */
1346*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1347*2b54f0dbSXin Li 				.size = 16 * 1024,
1348*2b54f0dbSXin Li 				.associativity = 4,
1349*2b54f0dbSXin Li 				.line_size = 64 /* assume same as L1D */
1350*2b54f0dbSXin Li 			};
1351*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1352*2b54f0dbSXin Li 				.size = 16 * 1024,
1353*2b54f0dbSXin Li 				.associativity = 4,
1354*2b54f0dbSXin Li 				.line_size = 64
1355*2b54f0dbSXin Li 			};
1356*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1357*2b54f0dbSXin Li 				.size = cluster_cores * 512 * 1024,
1358*2b54f0dbSXin Li 				.associativity = 8,
1359*2b54f0dbSXin Li 				.line_size = 128
1360*2b54f0dbSXin Li 			};
1361*2b54f0dbSXin Li 			break;
1362*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM && !defined(__ARM_ARCH_8A__) */
1363*2b54f0dbSXin Li 		case cpuinfo_uarch_kryo:
1364*2b54f0dbSXin Li 			/*
1365*2b54f0dbSXin Li 			 *  +-----------------+-------+-----------+-----------+-----------+-----------+
1366*2b54f0dbSXin Li 			 *  | Processor model | Cores | L1D cache | L1I cache | L2 cache  | Reference |
1367*2b54f0dbSXin Li 			 *  +-----------------+-------+-----------+-----------+-----------+-----------+
1368*2b54f0dbSXin Li 			 *  | Snapdragon 820  |  2+2  |    24K    |    32K    |  1M+512K  |   [1, 2]  |
1369*2b54f0dbSXin Li 			 *  | Snapdragon 821  |  2+2  |     ?     |     ?     |  1M+512K  |    [1]    |
1370*2b54f0dbSXin Li 			 *  +-----------------+-------+-----------+-----------+-----------+-----------+
1371*2b54f0dbSXin Li 			 *
1372*2b54f0dbSXin Li 			 * [1] http://www.anandtech.com/show/9837/snapdragon-820-preview/2
1373*2b54f0dbSXin Li 			 * [2] https://www.inforcecomputing.com/public_docs/Inforce6601/Inforce_6601_Micro-SOM_FAQs_04-2016-1.pdf
1374*2b54f0dbSXin Li 			 */
1375*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1376*2b54f0dbSXin Li 				.size = 32 * 1024,
1377*2b54f0dbSXin Li 				.associativity = 4,
1378*2b54f0dbSXin Li 				.line_size = 64
1379*2b54f0dbSXin Li 			};
1380*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1381*2b54f0dbSXin Li 				.size = 24 * 1024,
1382*2b54f0dbSXin Li 				.associativity = 3,
1383*2b54f0dbSXin Li 				.line_size = 64
1384*2b54f0dbSXin Li 			};
1385*2b54f0dbSXin Li 			if (midr_is_kryo_silver(midr)) {
1386*2b54f0dbSXin Li 				/* Kryo "Silver" */
1387*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
1388*2b54f0dbSXin Li 					.size = 512 * 1024,
1389*2b54f0dbSXin Li 					.associativity = 8,
1390*2b54f0dbSXin Li 					.line_size = 128
1391*2b54f0dbSXin Li 				};
1392*2b54f0dbSXin Li 			} else {
1393*2b54f0dbSXin Li 				/* Kryo "Gold" */
1394*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
1395*2b54f0dbSXin Li 					.size = 1024 * 1024,
1396*2b54f0dbSXin Li 					.associativity = 8,
1397*2b54f0dbSXin Li 					.line_size = 128
1398*2b54f0dbSXin Li 				};
1399*2b54f0dbSXin Li 			}
1400*2b54f0dbSXin Li 			break;
1401*2b54f0dbSXin Li 		case cpuinfo_uarch_denver:
1402*2b54f0dbSXin Li 		case cpuinfo_uarch_denver2:
1403*2b54f0dbSXin Li 			/*
1404*2b54f0dbSXin Li 			 * The Denver chip includes a 128KB, 4-way level 1 instruction cache, a 64KB, 4-way level 2 data cache,
1405*2b54f0dbSXin Li 			 * and a 2MB, 16-way level 2 cache, all of which can service both cores. [1]
1406*2b54f0dbSXin Li 			 *
1407*2b54f0dbSXin Li 			 * All the caches have 64-byte lines. [2]
1408*2b54f0dbSXin Li 			 *
1409*2b54f0dbSXin Li 			 * [1] http://www.pcworld.com/article/2463900/nvidia-reveals-pc-like-performance-for-denver-tegra-k1.html
1410*2b54f0dbSXin Li 			 * [2] http://linleygroup.com/newsletters/newsletter_detail.php?num=5205&year=2014
1411*2b54f0dbSXin Li 			 */
1412*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1413*2b54f0dbSXin Li 				.size = 128 * 1024,
1414*2b54f0dbSXin Li 				.associativity = 4,
1415*2b54f0dbSXin Li 				.line_size = 64
1416*2b54f0dbSXin Li 			};
1417*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1418*2b54f0dbSXin Li 				.size = 64 * 1024,
1419*2b54f0dbSXin Li 				.associativity = 4,
1420*2b54f0dbSXin Li 				.line_size = 64
1421*2b54f0dbSXin Li 			};
1422*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1423*2b54f0dbSXin Li 				.size = 2 * 1024 * 1024,
1424*2b54f0dbSXin Li 				.associativity = 16,
1425*2b54f0dbSXin Li 				.line_size = 64
1426*2b54f0dbSXin Li 			};
1427*2b54f0dbSXin Li 			break;
1428*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m1:
1429*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m2:
1430*2b54f0dbSXin Li 			/*
1431*2b54f0dbSXin Li 			 * - "Moving past branch prediction we can see some elements of how the cache is set up for the L1 I$,
1432*2b54f0dbSXin Li 			 *    namely 64 KB split into four sets with 128-byte line sizes for 128 cache lines per set" [1]
1433*2b54f0dbSXin Li 			 * - "For loads and stores, a 32 KB, 8-way set associative cache with 64 byte line size is used" [1]
1434*2b54f0dbSXin Li 			 * - "The L2 cache here is 2MB shared across all cores split into 16 sets. This memory is also split
1435*2b54f0dbSXin Li 			 *    into 4 banks and has a 22 cycle latency" [1]
1436*2b54f0dbSXin Li 			 *
1437*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
1438*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | Reference |
1439*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
1440*2b54f0dbSXin Li 			 *  | Exynos 8 Octa 8890 | 4(+4) |    64K    |    32K    |    2M     |    [1]    |
1441*2b54f0dbSXin Li 			 *  | Exynos 8 Octa 8895 | 4(+4) |    64K    |    32K    |    2M     |    [2]    |
1442*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+-----------+
1443*2b54f0dbSXin Li 			 *
1444*2b54f0dbSXin Li 			 * [1] http://www.anandtech.com/show/10590/hot-chips-2016-exynos-m1-architecture-disclosed
1445*2b54f0dbSXin Li 			 * [2] https://www.extremetech.com/mobile/244949-samsungs-exynos-8895-features-custom-cpu-cores-first-10nm-chip-market
1446*2b54f0dbSXin Li 			 */
1447*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1448*2b54f0dbSXin Li 				.size = 64 * 1024,
1449*2b54f0dbSXin Li 				.associativity = 4,
1450*2b54f0dbSXin Li 				.line_size = 128
1451*2b54f0dbSXin Li 			};
1452*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1453*2b54f0dbSXin Li 				.size = 32 * 1024,
1454*2b54f0dbSXin Li 				.associativity = 8,
1455*2b54f0dbSXin Li 				.line_size = 64
1456*2b54f0dbSXin Li 			};
1457*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1458*2b54f0dbSXin Li 				.size = 2 * 1024 * 1024,
1459*2b54f0dbSXin Li 				.associativity = 16,
1460*2b54f0dbSXin Li 				.line_size = 64
1461*2b54f0dbSXin Li 			};
1462*2b54f0dbSXin Li 			break;
1463*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m3:
1464*2b54f0dbSXin Li 			/*
1465*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1466*2b54f0dbSXin Li 			 *  | Processor model    | Cores | L1D cache | L1I cache | L2 cache  | L3 cache | Reference  |
1467*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1468*2b54f0dbSXin Li 			 *  | Exynos 9810        | 4(+4) |    64K    |     ?     |    512K   |    4M    |     [1]    |
1469*2b54f0dbSXin Li 			 *  +--------------------+-------+-----------+-----------+-----------+----------+------------+
1470*2b54f0dbSXin Li 			 *
1471*2b54f0dbSXin Li 			 * [1] https://www.anandtech.com/show/12478/exynos-9810-handson-awkward-first-results
1472*2b54f0dbSXin Li 			 */
1473*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1474*2b54f0dbSXin Li 				.size = 64 * 1024 /* assume same as in Exynos M1/M2 cores */,
1475*2b54f0dbSXin Li 				.associativity = 4 /* assume same as in Exynos M1/M2 cores */,
1476*2b54f0dbSXin Li 				.line_size = 128 /* assume same as in Exynos M1/M2 cores */
1477*2b54f0dbSXin Li 			};
1478*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1479*2b54f0dbSXin Li 				.size = 64 * 1024,
1480*2b54f0dbSXin Li 				.associativity = 8 /* assume same as in Exynos M1/M2 cores */,
1481*2b54f0dbSXin Li 				.line_size = 64 /* assume same as in Exynos M1/M2 cores */,
1482*2b54f0dbSXin Li 			};
1483*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1484*2b54f0dbSXin Li 				.size = 512 * 1024,
1485*2b54f0dbSXin Li 				.associativity = 16 /* assume same as in Exynos M1/M2 cores */,
1486*2b54f0dbSXin Li 				.line_size = 64 /* assume same as in Exynos M1/M2 cores */,
1487*2b54f0dbSXin Li 			};
1488*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1489*2b54f0dbSXin Li 				.size = 4 * 1024 * 1024,
1490*2b54f0dbSXin Li 				.associativity = 16 /* assume DynamIQ cache */,
1491*2b54f0dbSXin Li 				.line_size = 64 /* assume DynamIQ cache */,
1492*2b54f0dbSXin Li 			};
1493*2b54f0dbSXin Li 			break;
1494*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
1495*2b54f0dbSXin Li 		case cpuinfo_uarch_thunderx:
1496*2b54f0dbSXin Li 			/*
1497*2b54f0dbSXin Li 			 * "78K-Icache and 32K-D cache per core, 16 MB shared L2 cache" [1]
1498*2b54f0dbSXin Li 			 *
1499*2b54f0dbSXin Li 			 * [1] https://www.cavium.com/pdfFiles/ThunderX_CP_PB_Rev1.pdf
1500*2b54f0dbSXin Li 			 */
1501*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1502*2b54f0dbSXin Li 				.size = 78 * 1024,
1503*2b54f0dbSXin Li 				.associativity = 4 /* assumption */,
1504*2b54f0dbSXin Li 				.line_size = 64 /* assumption */
1505*2b54f0dbSXin Li 			};
1506*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1507*2b54f0dbSXin Li 				.size = 32 * 1024,
1508*2b54f0dbSXin Li 				.associativity = 4 /* assumption */,
1509*2b54f0dbSXin Li 				.line_size = 64 /* assumption */
1510*2b54f0dbSXin Li 			};
1511*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1512*2b54f0dbSXin Li 				.size = 16 * 1024 * 1024,
1513*2b54f0dbSXin Li 				.associativity = 8 /* assumption */,
1514*2b54f0dbSXin Li 				.line_size = 64 /* assumption */
1515*2b54f0dbSXin Li 			};
1516*2b54f0dbSXin Li 			break;
1517*2b54f0dbSXin Li 		case cpuinfo_uarch_taishan_v110:
1518*2b54f0dbSXin Li 			/*
1519*2b54f0dbSXin Li 			 * It features private 64 KiB L1 instruction and data caches as well as 512 KiB of private L2. [1]
1520*2b54f0dbSXin Li 			 *
1521*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+----------+-----------+
1522*2b54f0dbSXin Li 			 *  | Processor model  | Cores | L1D cache | L1I cache | L2 cache  | L3 cache | Reference |
1523*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+----------+-----------+
1524*2b54f0dbSXin Li 			 *  | Kunpeng 920-3226 |  32   |    64K    |    64K    |    512K   |    32M   |     [2]   |
1525*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+----------+-----------+
1526*2b54f0dbSXin Li 			 *  | Kunpeng 920-4826 |  48   |    64K    |    64K    |    512K   |    48M   |     [3]   |
1527*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+----------+-----------+
1528*2b54f0dbSXin Li 			 *  | Kunpeng 920-6426 |  64   |    64K    |    64K    |    512K   |    64M   |     [4]   |
1529*2b54f0dbSXin Li 			 *  +------------------+-------+-----------+-----------+-----------+----------+-----------+
1530*2b54f0dbSXin Li 			 *
1531*2b54f0dbSXin Li 			 * [1] https://en.wikichip.org/wiki/hisilicon/microarchitectures/taishan_v110
1532*2b54f0dbSXin Li 			 * [2] https://en.wikichip.org/wiki/hisilicon/kunpeng/920-3226
1533*2b54f0dbSXin Li 			 * [3] https://en.wikichip.org/wiki/hisilicon/kunpeng/920-4826
1534*2b54f0dbSXin Li 			 * [4] https://en.wikichip.org/wiki/hisilicon/kunpeng/920-6426
1535*2b54f0dbSXin Li 			 */
1536*2b54f0dbSXin Li 			*l1i = (struct cpuinfo_cache) {
1537*2b54f0dbSXin Li 				.size = 64 * 1024,
1538*2b54f0dbSXin Li 				.associativity = 4 /* assumption */,
1539*2b54f0dbSXin Li 				.line_size = 128 /* assumption */,
1540*2b54f0dbSXin Li 			};
1541*2b54f0dbSXin Li 			*l1d = (struct cpuinfo_cache) {
1542*2b54f0dbSXin Li 				.size = 64 * 1024,
1543*2b54f0dbSXin Li 				.associativity = 4 /* assumption */,
1544*2b54f0dbSXin Li 				.line_size = 128 /* assumption */,
1545*2b54f0dbSXin Li 			};
1546*2b54f0dbSXin Li 			*l2 = (struct cpuinfo_cache) {
1547*2b54f0dbSXin Li 				.size = 512 * 1024,
1548*2b54f0dbSXin Li 				.associativity = 8 /* assumption */,
1549*2b54f0dbSXin Li 				.line_size = 128 /* assumption */,
1550*2b54f0dbSXin Li 				.flags = CPUINFO_CACHE_INCLUSIVE /* assumption */,
1551*2b54f0dbSXin Li 			};
1552*2b54f0dbSXin Li 			*l3 = (struct cpuinfo_cache) {
1553*2b54f0dbSXin Li 				.size = cluster_cores * 1024 * 1024,
1554*2b54f0dbSXin Li 				.associativity = 16 /* assumption */,
1555*2b54f0dbSXin Li 				.line_size = 128 /* assumption */,
1556*2b54f0dbSXin Li 			};
1557*2b54f0dbSXin Li 			break;
1558*2b54f0dbSXin Li #endif
1559*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a12:
1560*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a32:
1561*2b54f0dbSXin Li 		default:
1562*2b54f0dbSXin Li 			cpuinfo_log_warning("target uarch not recognized; using generic cache parameters");
1563*2b54f0dbSXin Li 			/* Follow OpenBLAS */
1564*2b54f0dbSXin Li 			if (arch_version >= 8) {
1565*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
1566*2b54f0dbSXin Li 					.size = 32 * 1024,
1567*2b54f0dbSXin Li 					.associativity = 4,
1568*2b54f0dbSXin Li 					.line_size = 64
1569*2b54f0dbSXin Li 				};
1570*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
1571*2b54f0dbSXin Li 					.size = 32 * 1024,
1572*2b54f0dbSXin Li 					.associativity = 4,
1573*2b54f0dbSXin Li 					.line_size = 64
1574*2b54f0dbSXin Li 				};
1575*2b54f0dbSXin Li 				*l2 = (struct cpuinfo_cache) {
1576*2b54f0dbSXin Li 					.size = cluster_cores * 256 * 1024,
1577*2b54f0dbSXin Li 					.associativity = 8,
1578*2b54f0dbSXin Li 					.line_size = 64
1579*2b54f0dbSXin Li 				};
1580*2b54f0dbSXin Li 			} else {
1581*2b54f0dbSXin Li 				*l1i = (struct cpuinfo_cache) {
1582*2b54f0dbSXin Li 					.size = 16 * 1024,
1583*2b54f0dbSXin Li 					.associativity = 4,
1584*2b54f0dbSXin Li 					.line_size = 32
1585*2b54f0dbSXin Li 				};
1586*2b54f0dbSXin Li 				*l1d = (struct cpuinfo_cache) {
1587*2b54f0dbSXin Li 					.size = 16 * 1024,
1588*2b54f0dbSXin Li 					.associativity = 4,
1589*2b54f0dbSXin Li 					.line_size = 32
1590*2b54f0dbSXin Li 				};
1591*2b54f0dbSXin Li 				if (arch_version >= 7) {
1592*2b54f0dbSXin Li 					*l2 = (struct cpuinfo_cache) {
1593*2b54f0dbSXin Li 						.size = cluster_cores * 128 * 1024,
1594*2b54f0dbSXin Li 						.associativity = 8,
1595*2b54f0dbSXin Li 						.line_size = 32
1596*2b54f0dbSXin Li 					};
1597*2b54f0dbSXin Li 				}
1598*2b54f0dbSXin Li 			}
1599*2b54f0dbSXin Li 			break;
1600*2b54f0dbSXin Li 	}
1601*2b54f0dbSXin Li 	l1i->sets = l1i->size / (l1i->associativity * l1i->line_size);
1602*2b54f0dbSXin Li 	l1i->partitions = 1;
1603*2b54f0dbSXin Li 	l1d->sets = l1d->size / (l1d->associativity * l1d->line_size);
1604*2b54f0dbSXin Li 	l1d->partitions = 1;
1605*2b54f0dbSXin Li 	if (l2->size != 0) {
1606*2b54f0dbSXin Li 		l2->sets = l2->size / (l2->associativity * l2->line_size);
1607*2b54f0dbSXin Li 		l2->partitions = 1;
1608*2b54f0dbSXin Li 		if (l3->size != 0) {
1609*2b54f0dbSXin Li 			l3->sets = l3->size / (l3->associativity * l3->line_size);
1610*2b54f0dbSXin Li 			l3->partitions = 1;
1611*2b54f0dbSXin Li 		}
1612*2b54f0dbSXin Li 	}
1613*2b54f0dbSXin Li }
1614*2b54f0dbSXin Li 
cpuinfo_arm_compute_max_cache_size(const struct cpuinfo_processor * processor)1615*2b54f0dbSXin Li uint32_t cpuinfo_arm_compute_max_cache_size(const struct cpuinfo_processor* processor) {
1616*2b54f0dbSXin Li 	/*
1617*2b54f0dbSXin Li 	 * There is no precise way to detect cache size on ARM/ARM64, and cache size reported by cpuinfo
1618*2b54f0dbSXin Li 	 * may underestimate the actual cache size. Thus, we use microarchitecture-specific maximum.
1619*2b54f0dbSXin Li 	 */
1620*2b54f0dbSXin Li 	switch (processor->core->uarch) {
1621*2b54f0dbSXin Li 		case cpuinfo_uarch_xscale:
1622*2b54f0dbSXin Li 		case cpuinfo_uarch_arm11:
1623*2b54f0dbSXin Li 		case cpuinfo_uarch_scorpion:
1624*2b54f0dbSXin Li 		case cpuinfo_uarch_krait:
1625*2b54f0dbSXin Li 		case cpuinfo_uarch_kryo:
1626*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m1:
1627*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m2:
1628*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m3:
1629*2b54f0dbSXin Li 			/* cpuinfo-detected cache size always correct */
1630*2b54f0dbSXin Li 			return cpuinfo_compute_max_cache_size(processor);
1631*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a5:
1632*2b54f0dbSXin Li 			/* Max observed (NXP Vybrid SoC) */
1633*2b54f0dbSXin Li 			return 512 * 1024;
1634*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a7:
1635*2b54f0dbSXin Li 			/*
1636*2b54f0dbSXin Li 			 * Cortex-A7 MPCore Technical Reference Manual:
1637*2b54f0dbSXin Li 			 * 7.1. About the L2 Memory system
1638*2b54f0dbSXin Li 			 *   The L2 memory system consists of an:
1639*2b54f0dbSXin Li 			 *    - Optional tightly-coupled L2 cache that includes:
1640*2b54f0dbSXin Li 			 *      - Configurable L2 cache size of 128KB, 256KB, 512KB, and 1MB.
1641*2b54f0dbSXin Li 			 */
1642*2b54f0dbSXin Li 			return 1024 * 1024;
1643*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a8:
1644*2b54f0dbSXin Li 			/*
1645*2b54f0dbSXin Li 			 * Cortex-A8 Technical Reference Manual:
1646*2b54f0dbSXin Li 			 * 8.1. About the L2 memory system
1647*2b54f0dbSXin Li 			 *   The key features of the L2 memory system include:
1648*2b54f0dbSXin Li 			 *    - configurable cache size of 0KB, 128KB, 256KB, 512KB, and 1MB
1649*2b54f0dbSXin Li 			 */
1650*2b54f0dbSXin Li 			return 1024 * 1024;
1651*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a9:
1652*2b54f0dbSXin Li 			/* Max observed (e.g. Exynos 4212) */
1653*2b54f0dbSXin Li 			return 1024 * 1024;
1654*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a12:
1655*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a17:
1656*2b54f0dbSXin Li 			/*
1657*2b54f0dbSXin Li 			 * ARM Cortex-A17 MPCore Processor Technical Reference Manual:
1658*2b54f0dbSXin Li 			 * 7.1. About the L2 Memory system
1659*2b54f0dbSXin Li 			 *   The key features of the L2 memory system include:
1660*2b54f0dbSXin Li 			 *    - An integrated L2 cache:
1661*2b54f0dbSXin Li 			 *      - The cache size is implemented as either 256KB, 512KB, 1MB, 2MB, 4MB or 8MB.
1662*2b54f0dbSXin Li 			 */
1663*2b54f0dbSXin Li 			return 8 * 1024 * 1024;
1664*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a15:
1665*2b54f0dbSXin Li 			/*
1666*2b54f0dbSXin Li 			 * ARM Cortex-A15 MPCore Processor Technical Reference Manual:
1667*2b54f0dbSXin Li 			 * 7.1. About the L2 memory system
1668*2b54f0dbSXin Li 			 *   The features of the L2 memory system include:
1669*2b54f0dbSXin Li 			 *    - Configurable L2 cache size of 512KB, 1MB, 2MB and 4MB.
1670*2b54f0dbSXin Li 			 */
1671*2b54f0dbSXin Li 			return 4 * 1024 * 1024;
1672*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a35:
1673*2b54f0dbSXin Li 			/*
1674*2b54f0dbSXin Li 			 * ARM Cortex‑A35 Processor Technical Reference Manual:
1675*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
1676*2b54f0dbSXin Li 			 *   L2 cache
1677*2b54f0dbSXin Li 			 *    - Further features of the L2 cache are:
1678*2b54f0dbSXin Li 			 *      - Configurable size of 128KB, 256KB, 512KB, and 1MB.
1679*2b54f0dbSXin Li 			 */
1680*2b54f0dbSXin Li 			return 1024 * 1024;
1681*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a53:
1682*2b54f0dbSXin Li 			/*
1683*2b54f0dbSXin Li 			 * ARM Cortex-A53 MPCore Processor Technical Reference Manual:
1684*2b54f0dbSXin Li 			 * 7.1. About the L2 memory system
1685*2b54f0dbSXin Li 			 *   The L2 memory system consists of an:
1686*2b54f0dbSXin Li 			 *    - Optional tightly-coupled L2 cache that includes:
1687*2b54f0dbSXin Li 			 *      - Configurable L2 cache size of 128KB, 256KB, 512KB, 1MB and 2MB.
1688*2b54f0dbSXin Li 			 */
1689*2b54f0dbSXin Li 			return 2 * 1024 * 1024;
1690*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a57:
1691*2b54f0dbSXin Li 			/*
1692*2b54f0dbSXin Li 			 * ARM Cortex-A57 MPCore Processor Technical Reference Manual:
1693*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
1694*2b54f0dbSXin Li 			 *   The features of the L2 memory system include:
1695*2b54f0dbSXin Li 			 *    - Configurable L2 cache size of 512KB, 1MB, and 2MB.
1696*2b54f0dbSXin Li 			 */
1697*2b54f0dbSXin Li 			return 2 * 1024 * 1024;
1698*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a72:
1699*2b54f0dbSXin Li 			/*
1700*2b54f0dbSXin Li 			 * ARM Cortex-A72 MPCore Processor Technical Reference Manual:
1701*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
1702*2b54f0dbSXin Li 			 *   The features of the L2 memory system include:
1703*2b54f0dbSXin Li 			 *    - Configurable L2 cache size of 512KB, 1MB, 2MB and 4MB.
1704*2b54f0dbSXin Li 			 */
1705*2b54f0dbSXin Li 			return 4 * 1024 * 1024;
1706*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a73:
1707*2b54f0dbSXin Li 			/*
1708*2b54f0dbSXin Li 			 * ARM Cortex‑A73 MPCore Processor Technical Reference Manual
1709*2b54f0dbSXin Li 			 * 7.1 About the L2 memory system
1710*2b54f0dbSXin Li 			 *   The L2 memory system consists of:
1711*2b54f0dbSXin Li 			 *    - A tightly-integrated L2 cache with:
1712*2b54f0dbSXin Li 			 *       - A configurable size of 256KB, 512KB, 1MB, 2MB, 4MB, or 8MB.
1713*2b54f0dbSXin Li 			 */
1714*2b54f0dbSXin Li 			return 8 * 1024 * 1024;
1715*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a55:
1716*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_n1:
1717*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_v1:
1718*2b54f0dbSXin Li 		case cpuinfo_uarch_neoverse_n2:
1719*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a75:
1720*2b54f0dbSXin Li 		case cpuinfo_uarch_cortex_a76:
1721*2b54f0dbSXin Li 		case cpuinfo_uarch_exynos_m4:
1722*2b54f0dbSXin Li 		default:
1723*2b54f0dbSXin Li 			/*
1724*2b54f0dbSXin Li 			 * ARM DynamIQ Shared Unit Technical Reference Manual
1725*2b54f0dbSXin Li 			 * 1.3 Implementation options
1726*2b54f0dbSXin Li 			 *   L3_CACHE_SIZE
1727*2b54f0dbSXin Li 			 *    - 256KB
1728*2b54f0dbSXin Li 			 *    - 512KB
1729*2b54f0dbSXin Li 			 *    - 1024KB
1730*2b54f0dbSXin Li 			 *    - 1536KB
1731*2b54f0dbSXin Li 			 *    - 2048KB
1732*2b54f0dbSXin Li 			 *    - 3072KB
1733*2b54f0dbSXin Li 			 *    - 4096KB
1734*2b54f0dbSXin Li 			 */
1735*2b54f0dbSXin Li 			return 4 * 1024 * 1024;
1736*2b54f0dbSXin Li 	}
1737*2b54f0dbSXin Li }
1738