1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
4  *
5  */
6 
7 #include <linux/bitfield.h>
8 #include <linux/bitmap.h>
9 #include <linux/bitops.h>
10 #include <linux/cleanup.h>
11 #include <linux/device.h>
12 #include <linux/io.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/mutex.h>
16 #include <linux/nvmem-consumer.h>
17 #include <linux/of.h>
18 #include <linux/regmap.h>
19 #include <linux/sizes.h>
20 #include <linux/slab.h>
21 #include <linux/soc/qcom/llcc-qcom.h>
22 
23 #define ACTIVATE                      BIT(0)
24 #define DEACTIVATE                    BIT(1)
25 #define ACT_CLEAR                     BIT(0)
26 #define ACT_COMPLETE                  BIT(4)
27 #define ACT_CTRL_OPCODE_ACTIVATE      BIT(0)
28 #define ACT_CTRL_OPCODE_DEACTIVATE    BIT(1)
29 #define ACT_CTRL_ACT_TRIG             BIT(0)
30 #define ACT_CTRL_OPCODE_SHIFT         0x01
31 #define ATTR1_PROBE_TARGET_WAYS_SHIFT 0x02
32 #define ATTR1_FIXED_SIZE_SHIFT        0x03
33 #define ATTR1_PRIORITY_SHIFT          0x04
34 #define ATTR1_MAX_CAP_SHIFT           0x10
35 #define ATTR0_RES_WAYS_MASK           GENMASK(15, 0)
36 #define ATTR0_BONUS_WAYS_MASK         GENMASK(31, 16)
37 #define ATTR0_BONUS_WAYS_SHIFT        0x10
38 #define LLCC_STATUS_READ_DELAY        100
39 
40 #define CACHE_LINE_SIZE_SHIFT         6
41 
42 #define LLCC_LB_CNT_MASK              GENMASK(31, 28)
43 #define LLCC_LB_CNT_SHIFT             28
44 
45 #define MAX_CAP_TO_BYTES(n)           (n * SZ_1K)
46 #define LLCC_TRP_ACT_CTRLn(n)         (n * SZ_4K)
47 #define LLCC_TRP_ACT_CLEARn(n)        (8 + n * SZ_4K)
48 #define LLCC_TRP_STATUSn(n)           (4 + n * SZ_4K)
49 #define LLCC_TRP_ATTR0_CFGn(n)        (0x21000 + SZ_8 * n)
50 #define LLCC_TRP_ATTR1_CFGn(n)        (0x21004 + SZ_8 * n)
51 #define LLCC_TRP_ATTR2_CFGn(n)        (0x21100 + SZ_4 * n)
52 
53 #define LLCC_TRP_SCID_DIS_CAP_ALLOC   0x21f00
54 #define LLCC_TRP_PCB_ACT              0x21f04
55 #define LLCC_TRP_ALGO_CFG1	      0x21f0c
56 #define LLCC_TRP_ALGO_CFG2	      0x21f10
57 #define LLCC_TRP_ALGO_CFG3	      0x21f14
58 #define LLCC_TRP_ALGO_CFG4	      0x21f18
59 #define LLCC_TRP_ALGO_CFG5	      0x21f1c
60 #define LLCC_TRP_WRSC_EN              0x21f20
61 #define LLCC_TRP_ALGO_CFG6	      0x21f24
62 #define LLCC_TRP_ALGO_CFG7	      0x21f28
63 #define LLCC_TRP_WRSC_CACHEABLE_EN    0x21f2c
64 #define LLCC_TRP_ALGO_CFG8	      0x21f30
65 
66 #define LLCC_VERSION_2_0_0_0          0x02000000
67 #define LLCC_VERSION_2_1_0_0          0x02010000
68 #define LLCC_VERSION_4_1_0_0          0x04010000
69 
70 /**
71  * struct llcc_slice_config - Data associated with the llcc slice
72  * @usecase_id: Unique id for the client's use case
73  * @slice_id: llcc slice id for each client
74  * @max_cap: The maximum capacity of the cache slice provided in KB
75  * @priority: Priority of the client used to select victim line for replacement
76  * @fixed_size: Boolean indicating if the slice has a fixed capacity
77  * @bonus_ways: Bonus ways are additional ways to be used for any slice,
78  *		if client ends up using more than reserved cache ways. Bonus
79  *		ways are allocated only if they are not reserved for some
80  *		other client.
81  * @res_ways: Reserved ways for the cache slice, the reserved ways cannot
82  *		be used by any other client than the one its assigned to.
83  * @cache_mode: Each slice operates as a cache, this controls the mode of the
84  *             slice: normal or TCM(Tightly Coupled Memory)
85  * @probe_target_ways: Determines what ways to probe for access hit. When
86  *                    configured to 1 only bonus and reserved ways are probed.
87  *                    When configured to 0 all ways in llcc are probed.
88  * @dis_cap_alloc: Disable capacity based allocation for a client
89  * @retain_on_pc: If this bit is set and client has maintained active vote
90  *               then the ways assigned to this client are not flushed on power
91  *               collapse.
92  * @activate_on_init: Activate the slice immediately after it is programmed
93  * @write_scid_en: Bit enables write cache support for a given scid.
94  * @write_scid_cacheable_en: Enables write cache cacheable support for a
95  *			     given scid (not supported on v2 or older hardware).
96  * @stale_en: Bit enables stale.
97  * @stale_cap_en: Bit enables stale only if current scid is over-cap.
98  * @mru_uncap_en: Roll-over on reserved cache ways if current scid is
99  *                under-cap.
100  * @mru_rollover: Roll-over on reserved cache ways.
101  * @alloc_oneway_en: Allways allocate one way on over-cap even if there's no
102  *                   same-scid lines for replacement.
103  * @ovcap_en: Once current scid is over-capacity, allocate other over-cap SCID.
104  * @ovcap_prio: Once current scid is over-capacity, allocate other low priority
105  *              over-cap scid. Depends on corresponding bit being set in
106  *              ovcap_en.
107  * @vict_prio: When current scid is under-capacity, allocate over other
108  *             lower-than victim priority-line threshold scid.
109  */
110 struct llcc_slice_config {
111 	u32 usecase_id;
112 	u32 slice_id;
113 	u32 max_cap;
114 	u32 priority;
115 	bool fixed_size;
116 	u32 bonus_ways;
117 	u32 res_ways;
118 	u32 cache_mode;
119 	u32 probe_target_ways;
120 	bool dis_cap_alloc;
121 	bool retain_on_pc;
122 	bool activate_on_init;
123 	bool write_scid_en;
124 	bool write_scid_cacheable_en;
125 	bool stale_en;
126 	bool stale_cap_en;
127 	bool mru_uncap_en;
128 	bool mru_rollover;
129 	bool alloc_oneway_en;
130 	bool ovcap_en;
131 	bool ovcap_prio;
132 	bool vict_prio;
133 };
134 
135 struct qcom_llcc_config {
136 	const struct llcc_slice_config *sct_data;
137 	const u32 *reg_offset;
138 	const struct llcc_edac_reg_offset *edac_reg_offset;
139 	int size;
140 	bool need_llcc_cfg;
141 	bool no_edac;
142 	bool irq_configured;
143 };
144 
145 struct qcom_sct_config {
146 	const struct qcom_llcc_config *llcc_config;
147 	int num_config;
148 };
149 
150 enum llcc_reg_offset {
151 	LLCC_COMMON_HW_INFO,
152 	LLCC_COMMON_STATUS0,
153 };
154 
155 static const struct llcc_slice_config sa8775p_data[] =  {
156 	{
157 		.usecase_id = LLCC_CPUSS,
158 		.slice_id = 1,
159 		.max_cap = 2048,
160 		.priority = 1,
161 		.bonus_ways = 0xff,
162 		.cache_mode = 0,
163 		.retain_on_pc = true,
164 		.activate_on_init = true,
165 	}, {
166 		.usecase_id = LLCC_VIDSC0,
167 		.slice_id = 2,
168 		.max_cap = 512,
169 		.priority = 3,
170 		.fixed_size = true,
171 		.bonus_ways = 0xff,
172 		.cache_mode = 0,
173 		.retain_on_pc = true,
174 	}, {
175 		.usecase_id = LLCC_CPUSS1,
176 		.slice_id = 3,
177 		.max_cap = 1024,
178 		.priority = 1,
179 		.fixed_size = true,
180 		.bonus_ways = 0xff,
181 		.cache_mode = 0,
182 		.retain_on_pc = true,
183 	}, {
184 		.usecase_id = LLCC_CPUHWT,
185 		.slice_id = 5,
186 		.max_cap = 512,
187 		.priority = 1,
188 		.fixed_size = true,
189 		.bonus_ways = 0xff,
190 		.cache_mode = 0,
191 		.retain_on_pc = true,
192 	}, {
193 		.usecase_id = LLCC_AUDIO,
194 		.slice_id = 6,
195 		.max_cap = 1024,
196 		.priority = 1,
197 		.fixed_size = true,
198 		.bonus_ways = 0xff,
199 		.cache_mode = 0,
200 	}, {
201 		.usecase_id = LLCC_CMPT,
202 		.slice_id = 10,
203 		.max_cap = 4096,
204 		.priority = 1,
205 		.fixed_size = true,
206 		.bonus_ways = 0xff,
207 		.cache_mode = 0,
208 		.retain_on_pc = true,
209 	}, {
210 		.usecase_id = LLCC_GPUHTW,
211 		.slice_id = 11,
212 		.max_cap = 1024,
213 		.priority = 1,
214 		.fixed_size = true,
215 		.bonus_ways = 0xff,
216 		.cache_mode = 0,
217 		.retain_on_pc = true,
218 	}, {
219 		.usecase_id = LLCC_GPU,
220 		.slice_id = 12,
221 		.max_cap = 1024,
222 		.priority = 1,
223 		.fixed_size = true,
224 		.bonus_ways = 0xff,
225 		.cache_mode = 0,
226 		.retain_on_pc = true,
227 		.write_scid_en = true,
228 	}, {
229 		.usecase_id = LLCC_MMUHWT,
230 		.slice_id = 13,
231 		.max_cap = 1024,
232 		.priority = 1,
233 		.fixed_size = true,
234 		.bonus_ways = 0xff,
235 		.cache_mode = 0,
236 		.activate_on_init = true,
237 	}, {
238 		.usecase_id = LLCC_CMPTDMA,
239 		.slice_id = 15,
240 		.max_cap = 1024,
241 		.priority = 1,
242 		.fixed_size = true,
243 		.bonus_ways = 0xff,
244 		.cache_mode = 0,
245 		.retain_on_pc = true,
246 	}, {
247 		.usecase_id = LLCC_DISP,
248 		.slice_id = 16,
249 		.max_cap = 4096,
250 		.priority = 2,
251 		.fixed_size = true,
252 		.bonus_ways = 0xff,
253 		.cache_mode = 0,
254 		.retain_on_pc = true,
255 	}, {
256 		.usecase_id = LLCC_VIDFW,
257 		.slice_id = 17,
258 		.max_cap = 3072,
259 		.priority = 1,
260 		.bonus_ways = 0xff,
261 		.cache_mode = 0,
262 		.retain_on_pc = true,
263 	}, {
264 		.usecase_id = LLCC_AUDHW,
265 		.slice_id = 22,
266 		.max_cap = 1024,
267 		.priority = 1,
268 		.fixed_size = true,
269 		.bonus_ways = 0xff,
270 		.cache_mode = 0,
271 	}, {
272 		.usecase_id = LLCC_CVP,
273 		.slice_id = 28,
274 		.max_cap = 256,
275 		.priority = 3,
276 		.fixed_size = true,
277 		.bonus_ways = 0xff,
278 		.cache_mode = 0,
279 		.retain_on_pc = true,
280 	}, {
281 		.usecase_id = LLCC_APTCM,
282 		.slice_id = 30,
283 		.max_cap = 1024,
284 		.priority = 3,
285 		.fixed_size = true,
286 		.res_ways = 0xf0,
287 		.cache_mode = 1,
288 		.retain_on_pc = true,
289 	}, {
290 		.usecase_id = LLCC_WRCACHE,
291 		.slice_id = 31,
292 		.max_cap = 512,
293 		.priority = 1,
294 		.fixed_size = true,
295 		.bonus_ways = 0xff,
296 		.cache_mode = 0,
297 		.activate_on_init = true,
298 	},
299 };
300 
301 static const struct llcc_slice_config sc7180_data[] =  {
302 	{
303 		.usecase_id = LLCC_CPUSS,
304 		.slice_id = 1,
305 		.max_cap = 256,
306 		.priority = 1,
307 		.bonus_ways = 0xf,
308 		.cache_mode = 0,
309 		.retain_on_pc = true,
310 		.activate_on_init = true,
311 	}, {
312 		.usecase_id = LLCC_MDM,
313 		.slice_id = 8,
314 		.max_cap = 128,
315 		.priority = 1,
316 		.bonus_ways = 0xf,
317 		.cache_mode = 0,
318 		.retain_on_pc = true,
319 	}, {
320 		.usecase_id = LLCC_GPUHTW,
321 		.slice_id = 11,
322 		.max_cap = 128,
323 		.priority = 1,
324 		.bonus_ways = 0xf,
325 		.cache_mode = 0,
326 		.retain_on_pc = true,
327 	}, {
328 		.usecase_id = LLCC_GPU,
329 		.slice_id = 12,
330 		.max_cap = 128,
331 		.priority = 1,
332 		.bonus_ways = 0xf,
333 		.cache_mode = 0,
334 		.retain_on_pc = true,
335 	},
336 };
337 
338 static const struct llcc_slice_config sc7280_data[] =  {
339 	{
340 		.usecase_id = LLCC_CPUSS,
341 		.slice_id = 1,
342 		.max_cap = 768,
343 		.priority = 1,
344 		.bonus_ways = 0x3f,
345 		.cache_mode = 0,
346 		.retain_on_pc = true,
347 		.activate_on_init = true,
348 	}, {
349 		.usecase_id = LLCC_MDMHPGRW,
350 		.slice_id = 7,
351 		.max_cap = 512,
352 		.priority = 2,
353 		.fixed_size = true,
354 		.bonus_ways = 0x3f,
355 		.cache_mode = 0,
356 		.retain_on_pc = true,
357 	}, {
358 		.usecase_id = LLCC_CMPT,
359 		.slice_id = 10,
360 		.max_cap = 768,
361 		.priority = 1,
362 		.fixed_size = true,
363 		.bonus_ways = 0x3f,
364 		.cache_mode = 0,
365 		.retain_on_pc = true,
366 	}, {
367 		.usecase_id = LLCC_GPUHTW,
368 		.slice_id = 11,
369 		.max_cap = 256,
370 		.priority = 1,
371 		.fixed_size = true,
372 		.bonus_ways = 0x3f,
373 		.cache_mode = 0,
374 		.retain_on_pc = true,
375 	}, {
376 		.usecase_id = LLCC_GPU,
377 		.slice_id = 12,
378 		.max_cap = 512,
379 		.priority = 1,
380 		.bonus_ways = 0x3f,
381 		.cache_mode = 0,
382 		.retain_on_pc = true,
383 	}, {
384 		.usecase_id = LLCC_MMUHWT,
385 		.slice_id = 13,
386 		.max_cap = 256,
387 		.priority = 1,
388 		.fixed_size = true,
389 		.bonus_ways = 0x3f,
390 		.cache_mode = 0,
391 		.activate_on_init = true,
392 	}, {
393 		.usecase_id = LLCC_MDMPNG,
394 		.slice_id = 21,
395 		.max_cap = 768,
396 		.priority = 0,
397 		.fixed_size = true,
398 		.bonus_ways = 0x3f,
399 		.cache_mode = 0,
400 		.retain_on_pc = true,
401 	}, {
402 		.usecase_id = LLCC_WLHW,
403 		.slice_id = 24,
404 		.max_cap = 256,
405 		.priority = 1,
406 		.fixed_size = true,
407 		.bonus_ways = 0x3f,
408 		.cache_mode = 0,
409 		.retain_on_pc = true,
410 	}, {
411 		.usecase_id = LLCC_MODPE,
412 		.slice_id = 29,
413 		.max_cap = 64,
414 		.priority = 1,
415 		.fixed_size = true,
416 		.bonus_ways = 0x3f,
417 		.cache_mode = 0,
418 		.retain_on_pc = true,
419 	},
420 };
421 
422 static const struct llcc_slice_config sc8180x_data[] = {
423 	{
424 		.usecase_id = LLCC_CPUSS,
425 		.slice_id = 1,
426 		.max_cap = 6144,
427 		.priority = 1,
428 		.fixed_size = true,
429 		.bonus_ways = 0xfff,
430 		.cache_mode = 0,
431 		.retain_on_pc = true,
432 		.activate_on_init = true,
433 	}, {
434 		.usecase_id = LLCC_VIDSC0,
435 		.slice_id = 2,
436 		.max_cap = 512,
437 		.priority = 2,
438 		.fixed_size = true,
439 		.bonus_ways = 0xfff,
440 		.cache_mode = 0,
441 		.retain_on_pc = true,
442 	}, {
443 		.usecase_id = LLCC_VIDSC1,
444 		.slice_id = 3,
445 		.max_cap = 512,
446 		.priority = 2,
447 		.fixed_size = true,
448 		.bonus_ways = 0xfff,
449 		.cache_mode = 0,
450 		.retain_on_pc = true,
451 	}, {
452 		.usecase_id = LLCC_AUDIO,
453 		.slice_id = 6,
454 		.max_cap = 1024,
455 		.priority = 1,
456 		.fixed_size = true,
457 		.bonus_ways = 0xfff,
458 		.cache_mode = 0,
459 		.retain_on_pc = true,
460 	}, {
461 		.usecase_id = LLCC_MDMHPGRW,
462 		.slice_id = 7,
463 		.max_cap = 3072,
464 		.priority = 1,
465 		.fixed_size = true,
466 		.bonus_ways = 0x3ff,
467 		.res_ways = 0xc00,
468 		.cache_mode = 0,
469 		.retain_on_pc = true,
470 	}, {
471 		.usecase_id = LLCC_MDM,
472 		.slice_id = 8,
473 		.max_cap = 3072,
474 		.priority = 1,
475 		.fixed_size = true,
476 		.bonus_ways = 0xfff,
477 		.cache_mode = 0,
478 		.retain_on_pc = true,
479 	}, {
480 		.usecase_id = LLCC_MODHW,
481 		.slice_id = 9,
482 		.max_cap = 1024,
483 		.priority = 1,
484 		.fixed_size = true,
485 		.bonus_ways = 0xfff,
486 		.cache_mode = 0,
487 		.retain_on_pc = true,
488 	}, {
489 		.usecase_id = LLCC_CMPT,
490 		.slice_id = 10,
491 		.max_cap = 6144,
492 		.priority = 1,
493 		.fixed_size = true,
494 		.bonus_ways = 0xfff,
495 		.cache_mode = 0,
496 		.retain_on_pc = true,
497 	}, {
498 		.usecase_id = LLCC_GPUHTW,
499 		.slice_id = 11,
500 		.max_cap = 1024,
501 		.priority = 1,
502 		.fixed_size = true,
503 		.bonus_ways = 0xfff,
504 		.cache_mode = 0,
505 		.retain_on_pc = true,
506 	}, {
507 		.usecase_id = LLCC_GPU,
508 		.slice_id = 12,
509 		.max_cap = 5120,
510 		.priority = 1,
511 		.fixed_size = true,
512 		.bonus_ways = 0xfff,
513 		.cache_mode = 0,
514 		.retain_on_pc = true,
515 	}, {
516 		.usecase_id = LLCC_MMUHWT,
517 		.slice_id = 13,
518 		.max_cap = 1024,
519 		.priority = 1,
520 		.fixed_size = true,
521 		.bonus_ways = 0xfff,
522 		.cache_mode = 0,
523 		.activate_on_init = true,
524 	}, {
525 		.usecase_id = LLCC_CMPTDMA,
526 		.slice_id = 15,
527 		.max_cap = 6144,
528 		.priority = 1,
529 		.fixed_size = true,
530 		.bonus_ways = 0xfff,
531 		.cache_mode = 0,
532 		.retain_on_pc = true,
533 	}, {
534 		.usecase_id = LLCC_DISP,
535 		.slice_id = 16,
536 		.max_cap = 6144,
537 		.priority = 1,
538 		.fixed_size = true,
539 		.bonus_ways = 0xfff,
540 		.cache_mode = 0,
541 		.retain_on_pc = true,
542 	}, {
543 		.usecase_id = LLCC_VIDFW,
544 		.slice_id = 17,
545 		.max_cap = 1024,
546 		.priority = 1,
547 		.fixed_size = true,
548 		.bonus_ways = 0xfff,
549 		.cache_mode = 0,
550 		.retain_on_pc = true,
551 	}, {
552 		.usecase_id = LLCC_MDMHPFX,
553 		.slice_id = 20,
554 		.max_cap = 1024,
555 		.priority = 2,
556 		.fixed_size = true,
557 		.bonus_ways = 0xfff,
558 		.cache_mode = 0,
559 		.retain_on_pc = true,
560 	}, {
561 		.usecase_id = LLCC_MDMPNG,
562 		.slice_id = 21,
563 		.max_cap = 1024,
564 		.priority = 0,
565 		.fixed_size = true,
566 		.bonus_ways = 0xc,
567 		.cache_mode = 0,
568 		.retain_on_pc = true,
569 	}, {
570 		.usecase_id = LLCC_AUDHW,
571 		.slice_id = 22,
572 		.max_cap = 1024,
573 		.priority = 1,
574 		.fixed_size = true,
575 		.bonus_ways = 0xfff,
576 		.cache_mode = 0,
577 		.retain_on_pc = true,
578 	}, {
579 		.usecase_id = LLCC_NPU,
580 		.slice_id = 23,
581 		.max_cap = 6144,
582 		.priority = 1,
583 		.fixed_size = true,
584 		.bonus_ways = 0xfff,
585 		.cache_mode = 0,
586 		.retain_on_pc = true,
587 	}, {
588 		.usecase_id = LLCC_WLHW,
589 		.slice_id = 24,
590 		.max_cap = 6144,
591 		.priority = 1,
592 		.fixed_size = true,
593 		.bonus_ways = 0xfff,
594 		.cache_mode = 0,
595 		.retain_on_pc = true,
596 	}, {
597 		.usecase_id = LLCC_MODPE,
598 		.slice_id = 29,
599 		.max_cap = 512,
600 		.priority = 1,
601 		.fixed_size = true,
602 		.bonus_ways = 0xc,
603 		.cache_mode = 0,
604 		.retain_on_pc = true,
605 	}, {
606 		.usecase_id = LLCC_APTCM,
607 		.slice_id = 30,
608 		.max_cap = 512,
609 		.priority = 3,
610 		.fixed_size = true,
611 		.res_ways = 0x1,
612 		.cache_mode = 1,
613 		.retain_on_pc = true,
614 	}, {
615 		.usecase_id = LLCC_WRCACHE,
616 		.slice_id = 31,
617 		.max_cap = 128,
618 		.priority = 1,
619 		.fixed_size = true,
620 		.bonus_ways = 0xfff,
621 		.cache_mode = 0,
622 	},
623 };
624 
625 static const struct llcc_slice_config sc8280xp_data[] = {
626 	{
627 		.usecase_id = LLCC_CPUSS,
628 		.slice_id = 1,
629 		.max_cap = 6144,
630 		.priority = 1,
631 		.fixed_size = true,
632 		.bonus_ways = 0xfff,
633 		.cache_mode = 0,
634 		.retain_on_pc = true,
635 		.activate_on_init = true,
636 	}, {
637 		.usecase_id = LLCC_VIDSC0,
638 		.slice_id = 2,
639 		.max_cap = 512,
640 		.priority = 3,
641 		.fixed_size = true,
642 		.bonus_ways = 0xfff,
643 		.cache_mode = 0,
644 		.retain_on_pc = true,
645 	}, {
646 		.usecase_id = LLCC_AUDIO,
647 		.slice_id = 6,
648 		.max_cap = 1024,
649 		.priority = 1,
650 		.fixed_size = true,
651 		.bonus_ways = 0xfff,
652 		.cache_mode = 0,
653 	}, {
654 		.usecase_id = LLCC_CMPT,
655 		.slice_id = 10,
656 		.max_cap = 6144,
657 		.priority = 1,
658 		.fixed_size = true,
659 		.bonus_ways = 0xfff,
660 		.cache_mode = 0,
661 	}, {
662 		.usecase_id = LLCC_GPUHTW,
663 		.slice_id = 11,
664 		.max_cap = 1024,
665 		.priority = 1,
666 		.fixed_size = true,
667 		.bonus_ways = 0xfff,
668 		.cache_mode = 0,
669 		.retain_on_pc = true,
670 	}, {
671 		.usecase_id = LLCC_GPU,
672 		.slice_id = 12,
673 		.max_cap = 4096,
674 		.priority = 1,
675 		.fixed_size = true,
676 		.bonus_ways = 0xfff,
677 		.cache_mode = 0,
678 		.retain_on_pc = true,
679 		.write_scid_en = true,
680 	}, {
681 		.usecase_id = LLCC_MMUHWT,
682 		.slice_id = 13,
683 		.max_cap = 1024,
684 		.priority = 1,
685 		.fixed_size = true,
686 		.bonus_ways = 0xfff,
687 		.cache_mode = 0,
688 		.activate_on_init = true,
689 	}, {
690 		.usecase_id = LLCC_DISP,
691 		.slice_id = 16,
692 		.max_cap = 6144,
693 		.priority = 1,
694 		.fixed_size = true,
695 		.bonus_ways = 0xfff,
696 		.cache_mode = 0,
697 		.retain_on_pc = true,
698 	}, {
699 		.usecase_id = LLCC_AUDHW,
700 		.slice_id = 22,
701 		.max_cap = 2048,
702 		.priority = 1,
703 		.fixed_size = true,
704 		.bonus_ways = 0xfff,
705 		.cache_mode = 0,
706 		.retain_on_pc = true,
707 	}, {
708 		.usecase_id = LLCC_ECC,
709 		.slice_id = 26,
710 		.max_cap = 1024,
711 		.priority = 1,
712 		.fixed_size = true,
713 		.bonus_ways = 0xfff,
714 		.cache_mode = 0,
715 		.retain_on_pc = true,
716 	}, {
717 		.usecase_id = LLCC_CVP,
718 		.slice_id = 28,
719 		.max_cap = 512,
720 		.priority = 3,
721 		.fixed_size = true,
722 		.bonus_ways = 0xfff,
723 		.cache_mode = 0,
724 		.retain_on_pc = true,
725 	}, {
726 		.usecase_id = LLCC_APTCM,
727 		.slice_id = 30,
728 		.max_cap = 1024,
729 		.priority = 3,
730 		.fixed_size = true,
731 		.res_ways = 0x1,
732 		.cache_mode = 1,
733 		.retain_on_pc = true,
734 	}, {
735 		.usecase_id = LLCC_WRCACHE,
736 		.slice_id = 31,
737 		.max_cap = 1024,
738 		.priority = 1,
739 		.fixed_size = true,
740 		.bonus_ways = 0xfff,
741 		.cache_mode = 0,
742 		.activate_on_init = true,
743 	}, {
744 		.usecase_id = LLCC_CVPFW,
745 		.slice_id = 17,
746 		.max_cap = 512,
747 		.priority = 1,
748 		.bonus_ways = 0xfff,
749 		.cache_mode = 0,
750 		.retain_on_pc = true,
751 	}, {
752 		.usecase_id = LLCC_CPUSS1,
753 		.slice_id = 3,
754 		.max_cap = 2048,
755 		.priority = 1,
756 		.fixed_size = true,
757 		.bonus_ways = 0xfff,
758 		.cache_mode = 0,
759 		.retain_on_pc = true,
760 	}, {
761 		.usecase_id = LLCC_CPUHWT,
762 		.slice_id = 5,
763 		.max_cap = 512,
764 		.priority = 1,
765 		.fixed_size = true,
766 		.bonus_ways = 0xfff,
767 		.cache_mode = 0,
768 		.activate_on_init = true,
769 	},
770 };
771 
772 static const struct llcc_slice_config sdm845_data[] =  {{
773 		.usecase_id = LLCC_CPUSS,
774 		.slice_id = 1,
775 		.max_cap = 2816,
776 		.priority = 1,
777 		.bonus_ways = 0xffc,
778 		.res_ways = 0x2,
779 		.cache_mode = 0,
780 		.dis_cap_alloc = true,
781 		.retain_on_pc = true,
782 		.activate_on_init = true,
783 	}, {
784 		.usecase_id = LLCC_VIDSC0,
785 		.slice_id = 2,
786 		.max_cap = 512,
787 		.priority = 2,
788 		.fixed_size = true,
789 		.res_ways = 0xf0,
790 		.cache_mode = 0,
791 		.dis_cap_alloc = true,
792 		.retain_on_pc = true,
793 	}, {
794 		.usecase_id = LLCC_VIDSC1,
795 		.slice_id = 3,
796 		.max_cap = 512,
797 		.priority = 2,
798 		.fixed_size = true,
799 		.res_ways = 0xf0,
800 		.cache_mode = 0,
801 		.dis_cap_alloc = true,
802 		.retain_on_pc = true,
803 	}, {
804 		.usecase_id = LLCC_ROTATOR,
805 		.slice_id = 4,
806 		.max_cap = 563,
807 		.priority = 2,
808 		.fixed_size = true,
809 		.res_ways = 0xe,
810 		.cache_mode = 2,
811 		.dis_cap_alloc = true,
812 		.retain_on_pc = true,
813 	}, {
814 		.usecase_id = LLCC_VOICE,
815 		.slice_id = 5,
816 		.max_cap = 2816,
817 		.priority = 1,
818 		.bonus_ways = 0xffc,
819 		.res_ways = 0x2,
820 		.cache_mode = 0,
821 		.dis_cap_alloc = true,
822 		.retain_on_pc = true,
823 	}, {
824 		.usecase_id = LLCC_AUDIO,
825 		.slice_id = 6,
826 		.max_cap = 2816,
827 		.priority = 1,
828 		.bonus_ways = 0xffc,
829 		.res_ways = 0x2,
830 		.cache_mode = 0,
831 		.dis_cap_alloc = true,
832 		.retain_on_pc = true,
833 	}, {
834 		.usecase_id = LLCC_MDMHPGRW,
835 		.slice_id = 7,
836 		.max_cap = 1024,
837 		.priority = 2,
838 		.bonus_ways = 0xfc,
839 		.res_ways = 0xf00,
840 		.cache_mode = 0,
841 		.dis_cap_alloc = true,
842 		.retain_on_pc = true,
843 	}, {
844 		.usecase_id = LLCC_MDM,
845 		.slice_id = 8,
846 		.max_cap = 2816,
847 		.priority = 1,
848 		.bonus_ways = 0xffc,
849 		.res_ways = 0x2,
850 		.cache_mode = 0,
851 		.dis_cap_alloc = true,
852 		.retain_on_pc = true,
853 	}, {
854 		.usecase_id = LLCC_CMPT,
855 		.slice_id = 10,
856 		.max_cap = 2816,
857 		.priority = 1,
858 		.bonus_ways = 0xffc,
859 		.res_ways = 0x2,
860 		.cache_mode = 0,
861 		.dis_cap_alloc = true,
862 		.retain_on_pc = true,
863 	}, {
864 		.usecase_id = LLCC_GPUHTW,
865 		.slice_id = 11,
866 		.max_cap = 512,
867 		.priority = 1,
868 		.fixed_size = true,
869 		.bonus_ways = 0xc,
870 		.cache_mode = 0,
871 		.dis_cap_alloc = true,
872 		.retain_on_pc = true,
873 	}, {
874 		.usecase_id = LLCC_GPU,
875 		.slice_id = 12,
876 		.max_cap = 2304,
877 		.priority = 1,
878 		.bonus_ways = 0xff0,
879 		.res_ways = 0x2,
880 		.cache_mode = 0,
881 		.dis_cap_alloc = true,
882 		.retain_on_pc = true,
883 	}, {
884 		.usecase_id = LLCC_MMUHWT,
885 		.slice_id = 13,
886 		.max_cap = 256,
887 		.priority = 2,
888 		.res_ways = 0x1,
889 		.cache_mode = 0,
890 		.dis_cap_alloc = true,
891 		.activate_on_init = true,
892 	}, {
893 		.usecase_id = LLCC_CMPTDMA,
894 		.slice_id = 15,
895 		.max_cap = 2816,
896 		.priority = 1,
897 		.bonus_ways = 0xffc,
898 		.res_ways = 0x2,
899 		.cache_mode = 0,
900 		.dis_cap_alloc = true,
901 		.retain_on_pc = true,
902 	}, {
903 		.usecase_id = LLCC_DISP,
904 		.slice_id = 16,
905 		.max_cap = 2816,
906 		.priority = 1,
907 		.bonus_ways = 0xffc,
908 		.res_ways = 0x2,
909 		.cache_mode = 0,
910 		.dis_cap_alloc = true,
911 		.retain_on_pc = true,
912 	}, {
913 		.usecase_id = LLCC_VIDFW,
914 		.slice_id = 17,
915 		.max_cap = 2816,
916 		.priority = 1,
917 		.bonus_ways = 0xffc,
918 		.res_ways = 0x2,
919 		.cache_mode = 0,
920 		.dis_cap_alloc = true,
921 		.retain_on_pc = true,
922 	}, {
923 		.usecase_id = LLCC_MDMHPFX,
924 		.slice_id = 20,
925 		.max_cap = 1024,
926 		.priority = 2,
927 		.fixed_size = true,
928 		.res_ways = 0xf00,
929 		.cache_mode = 0,
930 		.dis_cap_alloc = true,
931 		.retain_on_pc = true,
932 	}, {
933 		.usecase_id = LLCC_MDMPNG,
934 		.slice_id = 21,
935 		.max_cap = 1024,
936 		.priority = 0,
937 		.fixed_size = true,
938 		.bonus_ways = 0x1e,
939 		.cache_mode = 0,
940 		.dis_cap_alloc = true,
941 		.retain_on_pc = true,
942 	}, {
943 		.usecase_id = LLCC_AUDHW,
944 		.slice_id = 22,
945 		.max_cap = 1024,
946 		.priority = 1,
947 		.fixed_size = true,
948 		.bonus_ways = 0xffc,
949 		.res_ways = 0x2,
950 		.cache_mode = 0,
951 		.dis_cap_alloc = true,
952 		.retain_on_pc = true,
953 	},
954 };
955 
956 static const struct llcc_slice_config sm6350_data[] =  {
957 	{
958 		.usecase_id = LLCC_CPUSS,
959 		.slice_id = 1,
960 		.max_cap = 768,
961 		.priority = 1,
962 		.bonus_ways = 0xfff,
963 		.cache_mode = 0,
964 		.activate_on_init = true,
965 		.write_scid_en = true,
966 	}, {
967 		.usecase_id = LLCC_MDM,
968 		.slice_id = 8,
969 		.max_cap = 512,
970 		.priority = 2,
971 		.bonus_ways = 0xfff,
972 		.cache_mode = 0,
973 		.activate_on_init = true,
974 	}, {
975 		.usecase_id = LLCC_GPUHTW,
976 		.slice_id = 11,
977 		.max_cap = 256,
978 		.priority = 1,
979 		.bonus_ways = 0xfff,
980 		.cache_mode = 0,
981 		.activate_on_init = true,
982 	}, {
983 		.usecase_id = LLCC_GPU,
984 		.slice_id = 12,
985 		.max_cap = 512,
986 		.priority = 1,
987 		.bonus_ways = 0xfff,
988 		.cache_mode = 0,
989 		.activate_on_init = true,
990 	}, {
991 		.usecase_id = LLCC_MDMPNG,
992 		.slice_id = 21,
993 		.max_cap = 768,
994 		.priority = 0,
995 		.fixed_size = true,
996 		.bonus_ways = 0xfff,
997 		.cache_mode = 0,
998 		.activate_on_init = true,
999 	}, {
1000 		.usecase_id = LLCC_NPU,
1001 		.slice_id = 23,
1002 		.max_cap = 768,
1003 		.priority = 1,
1004 		.bonus_ways = 0xfff,
1005 		.cache_mode = 0,
1006 		.activate_on_init = true,
1007 	}, {
1008 		.usecase_id = LLCC_MODPE,
1009 		.slice_id = 29,
1010 		.max_cap = 64,
1011 		.priority = 1,
1012 		.fixed_size = true,
1013 		.bonus_ways = 0xfff,
1014 		.cache_mode = 0,
1015 		.activate_on_init = true,
1016 	},
1017 };
1018 
1019 static const struct llcc_slice_config sm7150_data[] =  {
1020 	{
1021 		.usecase_id = LLCC_CPUSS,
1022 		.slice_id = 1,
1023 		.max_cap = 512,
1024 		.priority = 1,
1025 		.bonus_ways = 0xf,
1026 		.cache_mode = 0,
1027 		.retain_on_pc = true,
1028 		.activate_on_init = true,
1029 	}, {
1030 		.usecase_id = LLCC_MDM,
1031 		.slice_id = 8,
1032 		.max_cap = 128,
1033 		.priority = 2,
1034 		.bonus_ways = 0xf,
1035 		.cache_mode = 0,
1036 		.retain_on_pc = true,
1037 	}, {
1038 		.usecase_id = LLCC_GPUHTW,
1039 		.slice_id = 11,
1040 		.max_cap = 256,
1041 		.priority = 1,
1042 		.fixed_size = true,
1043 		.bonus_ways = 0xf,
1044 		.cache_mode = 0,
1045 		.retain_on_pc = true,
1046 	}, {
1047 		.usecase_id = LLCC_GPU,
1048 		.slice_id = 12,
1049 		.max_cap = 256,
1050 		.priority = 1,
1051 		.fixed_size = true,
1052 		.bonus_ways = 0xf,
1053 		.cache_mode = 0,
1054 		.retain_on_pc = true,
1055 	}, {
1056 		.usecase_id = LLCC_NPU,
1057 		.slice_id = 23,
1058 		.max_cap = 512,
1059 		.priority = 1,
1060 		.bonus_ways = 0xf,
1061 		.cache_mode = 0,
1062 		.retain_on_pc = true,
1063 	},
1064 };
1065 
1066 static const struct llcc_slice_config sm8150_data[] =  {
1067 	{
1068 		.usecase_id = LLCC_CPUSS,
1069 		.slice_id = 1,
1070 		.max_cap = 3072,
1071 		.priority = 1,
1072 		.fixed_size = true,
1073 		.bonus_ways = 0xfff,
1074 		.cache_mode = 0,
1075 		.retain_on_pc = true,
1076 		.activate_on_init = true,
1077 	}, {
1078 		.usecase_id = LLCC_VIDSC0,
1079 		.slice_id = 2,
1080 		.max_cap = 512,
1081 		.priority = 2,
1082 		.fixed_size = true,
1083 		.bonus_ways = 0xfff,
1084 		.cache_mode = 0,
1085 		.retain_on_pc = true,
1086 	}, {
1087 		.usecase_id = LLCC_VIDSC1,
1088 		.slice_id = 3,
1089 		.max_cap = 512,
1090 		.priority = 2,
1091 		.fixed_size = true,
1092 		.bonus_ways = 0xfff,
1093 		.cache_mode = 0,
1094 		.retain_on_pc = true,
1095 	}, {
1096 		.usecase_id = LLCC_AUDIO,
1097 		.slice_id = 6,
1098 		.max_cap = 1024,
1099 		.priority = 1,
1100 		.fixed_size = true,
1101 		.bonus_ways = 0xfff,
1102 		.cache_mode = 0,
1103 		.retain_on_pc = true,
1104 	}, {
1105 		.usecase_id = LLCC_MDMHPGRW,
1106 		.slice_id = 7,
1107 		.max_cap = 3072,
1108 		.priority = 1,
1109 		.bonus_ways = 0xff,
1110 		.res_ways = 0xf00,
1111 		.cache_mode = 0,
1112 		.retain_on_pc = true,
1113 	}, {
1114 		.usecase_id = LLCC_MDM,
1115 		.slice_id = 8,
1116 		.max_cap = 3072,
1117 		.priority = 1,
1118 		.fixed_size = true,
1119 		.bonus_ways = 0xfff,
1120 		.cache_mode = 0,
1121 		.retain_on_pc = true,
1122 	}, {
1123 		.usecase_id = LLCC_MODHW,
1124 		.slice_id = 9,
1125 		.max_cap = 1024,
1126 		.priority = 1,
1127 		.fixed_size = true,
1128 		.bonus_ways = 0xfff,
1129 		.cache_mode = 0,
1130 		.retain_on_pc = true,
1131 	}, {
1132 		.usecase_id = LLCC_CMPT,
1133 		.slice_id = 10,
1134 		.max_cap = 3072,
1135 		.priority = 1,
1136 		.fixed_size = true,
1137 		.bonus_ways = 0xfff,
1138 		.cache_mode = 0,
1139 		.retain_on_pc = true,
1140 	}, {
1141 		.usecase_id = LLCC_GPUHTW,
1142 		.slice_id = 11,
1143 		.max_cap = 512,
1144 		.priority = 1,
1145 		.fixed_size = true,
1146 		.bonus_ways = 0xfff,
1147 		.cache_mode = 0,
1148 		.retain_on_pc = true,
1149 	}, {
1150 		.usecase_id = LLCC_GPU,
1151 		.slice_id = 12,
1152 		.max_cap = 2560,
1153 		.priority = 1,
1154 		.fixed_size = true,
1155 		.bonus_ways = 0xfff,
1156 		.cache_mode = 0,
1157 		.retain_on_pc = true,
1158 	}, {
1159 		.usecase_id = LLCC_MMUHWT,
1160 		.slice_id = 13,
1161 		.max_cap = 1024,
1162 		.priority = 1,
1163 		.fixed_size = true,
1164 		.bonus_ways = 0xfff,
1165 		.cache_mode = 0,
1166 		.activate_on_init = true,
1167 	}, {
1168 		.usecase_id = LLCC_CMPTDMA,
1169 		.slice_id = 15,
1170 		.max_cap = 3072,
1171 		.priority = 1,
1172 		.fixed_size = true,
1173 		.bonus_ways = 0xfff,
1174 		.cache_mode = 0,
1175 		.retain_on_pc = true,
1176 	}, {
1177 		.usecase_id = LLCC_DISP,
1178 		.slice_id = 16,
1179 		.max_cap = 3072,
1180 		.priority = 1,
1181 		.fixed_size = true,
1182 		.bonus_ways = 0xfff,
1183 		.cache_mode = 0,
1184 		.retain_on_pc = true,
1185 	}, {
1186 		.usecase_id = LLCC_MDMHPFX,
1187 		.slice_id = 20,
1188 		.max_cap = 1024,
1189 		.priority = 2,
1190 		.fixed_size = true,
1191 		.bonus_ways = 0xfff,
1192 		.cache_mode = 0,
1193 		.retain_on_pc = true,
1194 	}, {
1195 		.usecase_id = LLCC_MDMHPFX,
1196 		.slice_id = 21,
1197 		.max_cap = 1024,
1198 		.priority = 0,
1199 		.fixed_size = true,
1200 		.bonus_ways = 0xf,
1201 		.cache_mode = 0,
1202 		.retain_on_pc = true,
1203 	}, {
1204 		.usecase_id = LLCC_AUDHW,
1205 		.slice_id = 22,
1206 		.max_cap = 1024,
1207 		.priority = 1,
1208 		.fixed_size = true,
1209 		.bonus_ways = 0xfff,
1210 		.cache_mode = 0,
1211 		.retain_on_pc = true,
1212 	}, {
1213 		.usecase_id = LLCC_NPU,
1214 		.slice_id = 23,
1215 		.max_cap = 3072,
1216 		.priority = 1,
1217 		.fixed_size = true,
1218 		.bonus_ways = 0xfff,
1219 		.cache_mode = 0,
1220 		.retain_on_pc = true,
1221 	}, {
1222 		.usecase_id = LLCC_WLHW,
1223 		.slice_id = 24,
1224 		.max_cap = 3072,
1225 		.priority = 1,
1226 		.fixed_size = true,
1227 		.bonus_ways = 0xfff,
1228 		.cache_mode = 0,
1229 		.retain_on_pc = true,
1230 	}, {
1231 		.usecase_id = LLCC_MODPE,
1232 		.slice_id = 29,
1233 		.max_cap = 256,
1234 		.priority = 1,
1235 		.fixed_size = true,
1236 		.bonus_ways = 0xf,
1237 		.cache_mode = 0,
1238 		.retain_on_pc = true,
1239 	}, {
1240 		.usecase_id = LLCC_APTCM,
1241 		.slice_id = 30,
1242 		.max_cap = 256,
1243 		.priority = 3,
1244 		.fixed_size = true,
1245 		.res_ways = 0x1,
1246 		.cache_mode = 1,
1247 		.retain_on_pc = true,
1248 	}, {
1249 		.usecase_id = LLCC_WRCACHE,
1250 		.slice_id = 31,
1251 		.max_cap = 128,
1252 		.priority = 1,
1253 		.fixed_size = true,
1254 		.bonus_ways = 0xfff,
1255 		.cache_mode = 0,
1256 	},
1257 };
1258 
1259 static const struct llcc_slice_config sm8250_data[] =  {
1260 	{
1261 		.usecase_id = LLCC_CPUSS,
1262 		.slice_id = 1,
1263 		.max_cap = 3072,
1264 		.priority = 1,
1265 		.fixed_size = true,
1266 		.bonus_ways = 0xfff,
1267 		.cache_mode = 0,
1268 		.retain_on_pc = true,
1269 		.activate_on_init = true,
1270 	}, {
1271 		.usecase_id = LLCC_VIDSC0,
1272 		.slice_id = 2,
1273 		.max_cap = 512,
1274 		.priority = 3,
1275 		.fixed_size = true,
1276 		.bonus_ways = 0xfff,
1277 		.cache_mode = 0,
1278 		.retain_on_pc = true,
1279 	}, {
1280 		.usecase_id = LLCC_AUDIO,
1281 		.slice_id = 6,
1282 		.max_cap = 1024,
1283 		.priority = 1,
1284 		.bonus_ways = 0xfff,
1285 		.cache_mode = 0,
1286 	}, {
1287 		.usecase_id = LLCC_CMPT,
1288 		.slice_id = 10,
1289 		.max_cap = 1024,
1290 		.priority = 1,
1291 		.bonus_ways = 0xfff,
1292 		.cache_mode = 0,
1293 	}, {
1294 		.usecase_id = LLCC_GPUHTW,
1295 		.slice_id = 11,
1296 		.max_cap = 1024,
1297 		.priority = 1,
1298 		.fixed_size = true,
1299 		.bonus_ways = 0xfff,
1300 		.cache_mode = 0,
1301 		.retain_on_pc = true,
1302 	}, {
1303 		.usecase_id = LLCC_GPU,
1304 		.slice_id = 12,
1305 		.max_cap = 1024,
1306 		.priority = 1,
1307 		.bonus_ways = 0xfff,
1308 		.cache_mode = 0,
1309 		.retain_on_pc = true,
1310 		.write_scid_en = true,
1311 	}, {
1312 		.usecase_id = LLCC_MMUHWT,
1313 		.slice_id = 13,
1314 		.max_cap = 1024,
1315 		.priority = 1,
1316 		.fixed_size = true,
1317 		.bonus_ways = 0xfff,
1318 		.cache_mode = 0,
1319 		.activate_on_init = true,
1320 	}, {
1321 		.usecase_id = LLCC_CMPTDMA,
1322 		.slice_id = 15,
1323 		.max_cap = 1024,
1324 		.priority = 1,
1325 		.bonus_ways = 0xfff,
1326 		.cache_mode = 0,
1327 		.retain_on_pc = true,
1328 	}, {
1329 		.usecase_id = LLCC_DISP,
1330 		.slice_id = 16,
1331 		.max_cap = 3072,
1332 		.priority = 1,
1333 		.fixed_size = true,
1334 		.bonus_ways = 0xfff,
1335 		.cache_mode = 0,
1336 		.retain_on_pc = true,
1337 	}, {
1338 		.usecase_id = LLCC_VIDFW,
1339 		.slice_id = 17,
1340 		.max_cap = 512,
1341 		.priority = 1,
1342 		.bonus_ways = 0xfff,
1343 		.cache_mode = 0,
1344 		.retain_on_pc = true,
1345 	}, {
1346 		.usecase_id = LLCC_AUDHW,
1347 		.slice_id = 22,
1348 		.max_cap = 1024,
1349 		.priority = 1,
1350 		.fixed_size = true,
1351 		.bonus_ways = 0xfff,
1352 		.cache_mode = 0,
1353 		.retain_on_pc = true,
1354 	}, {
1355 		.usecase_id = LLCC_NPU,
1356 		.slice_id = 23,
1357 		.max_cap = 3072,
1358 		.priority = 1,
1359 		.fixed_size = true,
1360 		.bonus_ways = 0xfff,
1361 		.cache_mode = 0,
1362 		.retain_on_pc = true,
1363 	}, {
1364 		.usecase_id = LLCC_WLHW,
1365 		.slice_id = 24,
1366 		.max_cap = 1024,
1367 		.priority = 1,
1368 		.bonus_ways = 0xfff,
1369 		.cache_mode = 0,
1370 		.retain_on_pc = true,
1371 	}, {
1372 		.usecase_id = LLCC_CVP,
1373 		.slice_id = 28,
1374 		.max_cap = 256,
1375 		.priority = 3,
1376 		.fixed_size = true,
1377 		.bonus_ways = 0xfff,
1378 		.cache_mode = 0,
1379 		.retain_on_pc = true,
1380 	}, {
1381 		.usecase_id = LLCC_APTCM,
1382 		.slice_id = 30,
1383 		.max_cap = 128,
1384 		.priority = 3,
1385 		.res_ways = 0x3,
1386 		.cache_mode = 1,
1387 		.retain_on_pc = true,
1388 	}, {
1389 		.usecase_id = LLCC_WRCACHE,
1390 		.slice_id = 31,
1391 		.max_cap = 256,
1392 		.priority = 1,
1393 		.fixed_size = true,
1394 		.bonus_ways = 0xfff,
1395 		.cache_mode = 0,
1396 		.activate_on_init = true,
1397 	},
1398 };
1399 
1400 static const struct llcc_slice_config sm8350_data[] =  {
1401 	{
1402 		.usecase_id = LLCC_CPUSS,
1403 		.slice_id = 1,
1404 		.max_cap = 3072,
1405 		.priority = 1,
1406 		.fixed_size = true,
1407 		.bonus_ways = 0xfff,
1408 		.cache_mode = 0,
1409 		.activate_on_init = true,
1410 		.write_scid_en = true,
1411 	}, {
1412 		.usecase_id = LLCC_VIDSC0,
1413 		.slice_id = 2,
1414 		.max_cap = 512,
1415 		.priority = 3,
1416 		.fixed_size = true,
1417 		.bonus_ways = 0xfff,
1418 		.cache_mode = 0,
1419 		.activate_on_init = true,
1420 	}, {
1421 		.usecase_id = LLCC_AUDIO,
1422 		.slice_id = 6,
1423 		.max_cap = 1024,
1424 		.priority = 1,
1425 		.fixed_size = true,
1426 		.bonus_ways = 0xfff,
1427 		.cache_mode = 0,
1428 	}, {
1429 		.usecase_id = LLCC_MDMHPGRW,
1430 		.slice_id = 7,
1431 		.max_cap = 1024,
1432 		.priority = 3,
1433 		.bonus_ways = 0xfff,
1434 		.cache_mode = 0,
1435 		.activate_on_init = true,
1436 	}, {
1437 		.usecase_id = LLCC_MODHW,
1438 		.slice_id = 9,
1439 		.max_cap = 1024,
1440 		.priority = 1,
1441 		.fixed_size = true,
1442 		.bonus_ways = 0xfff,
1443 		.cache_mode = 0,
1444 		.activate_on_init = true,
1445 	}, {
1446 		.usecase_id = LLCC_CMPT,
1447 		.slice_id = 10,
1448 		.max_cap = 3072,
1449 		.priority = 1,
1450 		.fixed_size = true,
1451 		.bonus_ways = 0xfff,
1452 		.cache_mode = 0,
1453 		.activate_on_init = true,
1454 	}, {
1455 		.usecase_id = LLCC_GPUHTW,
1456 		.slice_id = 11,
1457 		.max_cap = 1024,
1458 		.priority = 1,
1459 		.fixed_size = true,
1460 		.bonus_ways = 0xfff,
1461 		.cache_mode = 0,
1462 		.activate_on_init = true,
1463 	}, {
1464 		.usecase_id = LLCC_GPU,
1465 		.slice_id = 12,
1466 		.max_cap = 1024,
1467 		.priority = 1,
1468 		.bonus_ways = 0xfff,
1469 		.cache_mode = 0,
1470 		.retain_on_pc = true,
1471 		.activate_on_init = true,
1472 	}, {
1473 		.usecase_id = LLCC_MMUHWT,
1474 		.slice_id = 13,
1475 		.max_cap = 1024,
1476 		.priority = 1,
1477 		.fixed_size = true,
1478 		.bonus_ways = 0xfff,
1479 		.cache_mode = 0,
1480 		.write_scid_en = true,
1481 	}, {
1482 		.usecase_id = LLCC_DISP,
1483 		.slice_id = 16,
1484 		.max_cap = 3072,
1485 		.priority = 2,
1486 		.fixed_size = true,
1487 		.bonus_ways = 0xfff,
1488 		.cache_mode = 0,
1489 		.activate_on_init = true,
1490 	}, {
1491 		.usecase_id = LLCC_MDMPNG,
1492 		.slice_id = 21,
1493 		.max_cap = 1024,
1494 		.priority = 0,
1495 		.fixed_size = true,
1496 		.bonus_ways = 0xf,
1497 		.cache_mode = 0,
1498 		.activate_on_init = true,
1499 	}, {
1500 		.usecase_id = LLCC_AUDHW,
1501 		.slice_id = 22,
1502 		.max_cap = 1024,
1503 		.priority = 1,
1504 		.fixed_size = true,
1505 		.bonus_ways = 0xfff,
1506 		.cache_mode = 0,
1507 		.activate_on_init = true,
1508 	}, {
1509 		.usecase_id = LLCC_CVP,
1510 		.slice_id = 28,
1511 		.max_cap = 512,
1512 		.priority = 3,
1513 		.fixed_size = true,
1514 		.bonus_ways = 0xfff,
1515 		.cache_mode = 0,
1516 		.activate_on_init = true,
1517 	}, {
1518 		.usecase_id = LLCC_MODPE,
1519 		.slice_id = 29,
1520 		.max_cap = 256,
1521 		.priority = 1,
1522 		.fixed_size = true,
1523 		.bonus_ways = 0xf,
1524 		.cache_mode = 0,
1525 		.activate_on_init = true,
1526 	}, {
1527 		.usecase_id = LLCC_APTCM,
1528 		.slice_id = 30,
1529 		.max_cap = 1024,
1530 		.priority = 3,
1531 		.fixed_size = true,
1532 		.res_ways = 0x1,
1533 		.cache_mode = 1,
1534 		.activate_on_init = true,
1535 	}, {
1536 		.usecase_id = LLCC_WRCACHE,
1537 		.slice_id = 31,
1538 		.max_cap = 512,
1539 		.priority = 1,
1540 		.fixed_size = true,
1541 		.bonus_ways = 0xfff,
1542 		.cache_mode = 0,
1543 		.write_scid_en = true,
1544 	}, {
1545 		.usecase_id = LLCC_CVPFW,
1546 		.slice_id = 17,
1547 		.max_cap = 512,
1548 		.priority = 1,
1549 		.bonus_ways = 0xfff,
1550 		.cache_mode = 0,
1551 		.activate_on_init = true,
1552 	}, {
1553 		.usecase_id = LLCC_CPUSS1,
1554 		.slice_id = 3,
1555 		.max_cap = 1024,
1556 		.priority = 1,
1557 		.fixed_size = true,
1558 		.bonus_ways = 0xfff,
1559 		.cache_mode = 0,
1560 		.activate_on_init = true,
1561 	}, {
1562 		.usecase_id = LLCC_CPUHWT,
1563 		.slice_id = 5,
1564 		.max_cap = 512,
1565 		.priority = 1,
1566 		.fixed_size = true,
1567 		.bonus_ways = 0xfff,
1568 		.cache_mode = 0,
1569 		.write_scid_en = true,
1570 	},
1571 };
1572 
1573 static const struct llcc_slice_config sm8450_data[] =  {
1574 	{
1575 		.usecase_id = LLCC_CPUSS,
1576 		.slice_id = 1,
1577 		.max_cap = 3072,
1578 		.priority = 1,
1579 		.bonus_ways = 0xffff,
1580 		.cache_mode = 0,
1581 		.retain_on_pc = true,
1582 		.activate_on_init = true,
1583 	}, {
1584 		.usecase_id = LLCC_VIDSC0,
1585 		.slice_id = 2,
1586 		.max_cap = 512,
1587 		.priority = 3,
1588 		.fixed_size = true,
1589 		.bonus_ways = 0xffff,
1590 		.cache_mode = 0,
1591 		.retain_on_pc = true,
1592 	}, {
1593 		.usecase_id = LLCC_AUDIO,
1594 		.slice_id = 6,
1595 		.max_cap = 1024,
1596 		.priority = 1,
1597 		.fixed_size = true,
1598 		.bonus_ways = 0xffff,
1599 		.cache_mode = 0,
1600 	}, {
1601 		.usecase_id = LLCC_MDMHPGRW,
1602 		.slice_id = 7,
1603 		.max_cap = 1024,
1604 		.priority = 3,
1605 		.bonus_ways = 0xffff,
1606 		.cache_mode = 0,
1607 		.retain_on_pc = true,
1608 	}, {
1609 		.usecase_id = LLCC_MODHW,
1610 		.slice_id = 9,
1611 		.max_cap = 1024,
1612 		.priority = 1,
1613 		.fixed_size = true,
1614 		.bonus_ways = 0xffff,
1615 		.cache_mode = 0,
1616 		.retain_on_pc = true,
1617 	}, {
1618 		.usecase_id = LLCC_CMPT,
1619 		.slice_id = 10,
1620 		.max_cap = 4096,
1621 		.priority = 1,
1622 		.fixed_size = true,
1623 		.bonus_ways = 0xffff,
1624 		.cache_mode = 0,
1625 		.retain_on_pc = true,
1626 	}, {
1627 		.usecase_id = LLCC_GPUHTW,
1628 		.slice_id = 11,
1629 		.max_cap = 512,
1630 		.priority = 1,
1631 		.fixed_size = true,
1632 		.bonus_ways = 0xffff,
1633 		.cache_mode = 0,
1634 		.retain_on_pc = true,
1635 	}, {
1636 		.usecase_id = LLCC_GPU,
1637 		.slice_id = 12,
1638 		.max_cap = 2048,
1639 		.priority = 1,
1640 		.fixed_size = true,
1641 		.bonus_ways = 0xffff,
1642 		.cache_mode = 0,
1643 		.retain_on_pc = true,
1644 		.write_scid_en = true,
1645 	}, {
1646 		.usecase_id = LLCC_MMUHWT,
1647 		.slice_id = 13,
1648 		.max_cap = 768,
1649 		.priority = 1,
1650 		.fixed_size = true,
1651 		.bonus_ways = 0xffff,
1652 		.cache_mode = 0,
1653 		.activate_on_init = true,
1654 	}, {
1655 		.usecase_id = LLCC_DISP,
1656 		.slice_id = 16,
1657 		.max_cap = 4096,
1658 		.priority = 2,
1659 		.fixed_size = true,
1660 		.bonus_ways = 0xffff,
1661 		.cache_mode = 0,
1662 		.retain_on_pc = true,
1663 	}, {
1664 		.usecase_id = LLCC_MDMPNG,
1665 		.slice_id = 21,
1666 		.max_cap = 1024,
1667 		.priority = 1,
1668 		.fixed_size = true,
1669 		.bonus_ways = 0xf000,
1670 		.cache_mode = 0,
1671 		.retain_on_pc = true,
1672 	}, {
1673 		.usecase_id = LLCC_AUDHW,
1674 		.slice_id = 22,
1675 		.max_cap = 1024,
1676 		.priority = 1,
1677 		.fixed_size = true,
1678 		.bonus_ways = 0xffff,
1679 		.cache_mode = 0,
1680 	}, {
1681 		.usecase_id = LLCC_CVP,
1682 		.slice_id = 28,
1683 		.max_cap = 256,
1684 		.priority = 3,
1685 		.fixed_size = true,
1686 		.bonus_ways = 0xffff,
1687 		.cache_mode = 0,
1688 		.retain_on_pc = true,
1689 	}, {
1690 		.usecase_id = LLCC_MODPE,
1691 		.slice_id = 29,
1692 		.max_cap = 64,
1693 		.priority = 1,
1694 		.fixed_size = true,
1695 		.bonus_ways = 0xf000,
1696 		.cache_mode = 0,
1697 		.retain_on_pc = true,
1698 	}, {
1699 		.usecase_id = LLCC_APTCM,
1700 		.slice_id = 30,
1701 		.max_cap = 1024,
1702 		.priority = 3,
1703 		.fixed_size = true,
1704 		.res_ways = 0xf0,
1705 		.cache_mode = 1,
1706 		.retain_on_pc = true,
1707 	}, {
1708 		.usecase_id = LLCC_WRCACHE,
1709 		.slice_id = 31,
1710 		.max_cap = 512,
1711 		.priority = 1,
1712 		.fixed_size = true,
1713 		.bonus_ways = 0xffff,
1714 		.cache_mode = 0,
1715 		.activate_on_init = true,
1716 	}, {
1717 		.usecase_id = LLCC_CVPFW,
1718 		.slice_id = 17,
1719 		.max_cap = 512,
1720 		.priority = 1,
1721 		.fixed_size = true,
1722 		.bonus_ways = 0xffff,
1723 		.cache_mode = 0,
1724 		.retain_on_pc = true,
1725 	}, {
1726 		.usecase_id = LLCC_CPUSS1,
1727 		.slice_id = 3,
1728 		.max_cap = 1024,
1729 		.priority = 1,
1730 		.fixed_size = true,
1731 		.bonus_ways = 0xffff,
1732 		.cache_mode = 0,
1733 		.retain_on_pc = true,
1734 	}, {
1735 		.usecase_id = LLCC_CAMEXP0,
1736 		.slice_id = 4,
1737 		.max_cap = 256,
1738 		.priority = 3,
1739 		.fixed_size = true,
1740 		.bonus_ways = 0xffff,
1741 		.cache_mode = 0,
1742 		.retain_on_pc = true,
1743 	}, {
1744 		.usecase_id = LLCC_CPUMTE,
1745 		.slice_id = 23,
1746 		.max_cap = 256,
1747 		.priority = 1,
1748 		.fixed_size = true,
1749 		.bonus_ways = 0xfff,
1750 		.cache_mode = 0,
1751 		.activate_on_init = true,
1752 	}, {
1753 		.usecase_id = LLCC_CPUHWT,
1754 		.slice_id = 5,
1755 		.max_cap = 512,
1756 		.priority = 1,
1757 		.fixed_size = true,
1758 		.bonus_ways = 0xffff,
1759 		.cache_mode = 0,
1760 		.retain_on_pc = true,
1761 		.activate_on_init = true,
1762 	}, {
1763 		.usecase_id = LLCC_CAMEXP1,
1764 		.slice_id = 27,
1765 		.max_cap = 256,
1766 		.priority = 3,
1767 		.fixed_size = true,
1768 		.bonus_ways = 0xffff,
1769 		.cache_mode = 0,
1770 		.retain_on_pc = true,
1771 	}, {
1772 		.usecase_id = LLCC_AENPU,
1773 		.slice_id = 8,
1774 		.max_cap = 2048,
1775 		.priority = 1,
1776 		.fixed_size = true,
1777 		.bonus_ways = 0xffff,
1778 		.cache_mode = 0,
1779 	},
1780 };
1781 
1782 static const struct llcc_slice_config sm8550_data[] =  {
1783 	{
1784 		.usecase_id = LLCC_CPUSS,
1785 		.slice_id = 1,
1786 		.max_cap = 5120,
1787 		.priority = 1,
1788 		.bonus_ways = 0xffffff,
1789 		.cache_mode = 0,
1790 		.activate_on_init = true,
1791 		.write_scid_en = true,
1792 	}, {
1793 		.usecase_id = LLCC_VIDSC0,
1794 		.slice_id = 2,
1795 		.max_cap = 512,
1796 		.priority = 4,
1797 		.fixed_size = true,
1798 		.bonus_ways = 0xffffff,
1799 		.cache_mode = 0,
1800 	}, {
1801 		.usecase_id = LLCC_AUDIO,
1802 		.slice_id = 6,
1803 		.max_cap = 1024,
1804 		.priority = 1,
1805 		.fixed_size = true,
1806 		.bonus_ways = 0xffffff,
1807 		.cache_mode = 0,
1808 	}, {
1809 		.usecase_id = LLCC_MDMHPGRW,
1810 		.slice_id = 25,
1811 		.max_cap = 1024,
1812 		.priority = 4,
1813 		.bonus_ways = 0xffffff,
1814 		.cache_mode = 0,
1815 	}, {
1816 		.usecase_id = LLCC_MODHW,
1817 		.slice_id = 26,
1818 		.max_cap = 1024,
1819 		.priority = 1,
1820 		.fixed_size = true,
1821 		.bonus_ways = 0xffffff,
1822 		.cache_mode = 0,
1823 	}, {
1824 		.usecase_id = LLCC_CMPT,
1825 		.slice_id = 10,
1826 		.max_cap = 4096,
1827 		.priority = 1,
1828 		.fixed_size = true,
1829 		.bonus_ways = 0xffffff,
1830 		.cache_mode = 0,
1831 	}, {
1832 		.usecase_id = LLCC_GPUHTW,
1833 		.slice_id = 11,
1834 		.max_cap = 512,
1835 		.priority = 1,
1836 		.fixed_size = true,
1837 		.bonus_ways = 0xffffff,
1838 		.cache_mode = 0,
1839 	}, {
1840 		.usecase_id = LLCC_GPU,
1841 		.slice_id = 9,
1842 		.max_cap = 3096,
1843 		.priority = 1,
1844 		.bonus_ways = 0xffffff,
1845 		.cache_mode = 0,
1846 		.write_scid_en = true,
1847 		.write_scid_cacheable_en = true,
1848 	}, {
1849 		.usecase_id = LLCC_MMUHWT,
1850 		.slice_id = 18,
1851 		.max_cap = 768,
1852 		.priority = 1,
1853 		.fixed_size = true,
1854 		.bonus_ways = 0xffffff,
1855 		.cache_mode = 0,
1856 		.activate_on_init = true,
1857 	}, {
1858 		.usecase_id = LLCC_DISP,
1859 		.slice_id = 16,
1860 		.max_cap = 6144,
1861 		.priority = 1,
1862 		.fixed_size = true,
1863 		.bonus_ways = 0xffffff,
1864 		.cache_mode = 2,
1865 	}, {
1866 		.usecase_id = LLCC_MDMPNG,
1867 		.slice_id = 27,
1868 		.max_cap = 1024,
1869 		.priority = 0,
1870 		.fixed_size = true,
1871 		.bonus_ways = 0xf00000,
1872 		.cache_mode = 0,
1873 	}, {
1874 		.usecase_id = LLCC_AUDHW,
1875 		.slice_id = 22,
1876 		.max_cap = 1024,
1877 		.priority = 1,
1878 		.fixed_size = true,
1879 		.bonus_ways = 0xffffff,
1880 		.cache_mode = 0,
1881 	}, {
1882 		.usecase_id = LLCC_CVP,
1883 		.slice_id = 8,
1884 		.max_cap = 256,
1885 		.priority = 4,
1886 		.fixed_size = true,
1887 		.bonus_ways = 0xffffff,
1888 		.cache_mode = 0,
1889 	}, {
1890 		.usecase_id = LLCC_MODPE,
1891 		.slice_id = 29,
1892 		.max_cap = 64,
1893 		.priority = 1,
1894 		.fixed_size = true,
1895 		.bonus_ways = 0xf00000,
1896 		.cache_mode = 0,
1897 		.alloc_oneway_en = true,
1898 		.vict_prio = true,
1899 	}, {
1900 		.usecase_id = LLCC_WRCACHE,
1901 		.slice_id = 31,
1902 		.max_cap = 512,
1903 		.priority = 1,
1904 		.fixed_size = true,
1905 		.bonus_ways = 0xffffff,
1906 		.cache_mode = 0,
1907 		.activate_on_init = true,
1908 	}, {
1909 		.usecase_id = LLCC_CAMEXP0,
1910 		.slice_id = 4,
1911 		.max_cap = 256,
1912 		.priority = 4,
1913 		.fixed_size = true,
1914 		.bonus_ways = 0xf,
1915 		.cache_mode = 0,
1916 	}, {
1917 		.usecase_id = LLCC_CPUHWT,
1918 		.slice_id = 5,
1919 		.max_cap = 512,
1920 		.priority = 1,
1921 		.fixed_size = true,
1922 		.bonus_ways = 0xffffff,
1923 		.cache_mode = 0,
1924 		.activate_on_init = true,
1925 	}, {
1926 		.usecase_id = LLCC_CAMEXP1,
1927 		.slice_id = 7,
1928 		.max_cap = 3200,
1929 		.priority = 3,
1930 		.fixed_size = true,
1931 		.bonus_ways = 0xfffff0,
1932 		.cache_mode = 2,
1933 	}, {
1934 		.usecase_id = LLCC_CMPTHCP,
1935 		.slice_id = 17,
1936 		.max_cap = 256,
1937 		.priority = 4,
1938 		.fixed_size = true,
1939 		.bonus_ways = 0xffffff,
1940 		.cache_mode = 0,
1941 	}, {
1942 		.usecase_id = LLCC_LCPDARE,
1943 		.slice_id = 30,
1944 		.max_cap = 128,
1945 		.priority = 4,
1946 		.fixed_size = true,
1947 		.bonus_ways = 0xffffff,
1948 		.cache_mode = 0,
1949 		.activate_on_init = true,
1950 		.alloc_oneway_en = true,
1951 		.vict_prio = true,
1952 	}, {
1953 		.usecase_id = LLCC_AENPU,
1954 		.slice_id = 3,
1955 		.max_cap = 3072,
1956 		.priority = 1,
1957 		.fixed_size = true,
1958 		.bonus_ways = 0xfe01ff,
1959 		.cache_mode = 2,
1960 	}, {
1961 		.usecase_id = LLCC_ISLAND1,
1962 		.slice_id = 12,
1963 		.max_cap = 1792,
1964 		.priority = 7,
1965 		.fixed_size = true,
1966 		.bonus_ways = 0xfe00,
1967 		.cache_mode = 0,
1968 	}, {
1969 		.usecase_id = LLCC_ISLAND4,
1970 		.slice_id = 15,
1971 		.max_cap = 256,
1972 		.priority = 7,
1973 		.fixed_size = true,
1974 		.bonus_ways = 0x10000,
1975 		.cache_mode = 0,
1976 	}, {
1977 		.usecase_id = LLCC_CAMEXP2,
1978 		.slice_id = 19,
1979 		.max_cap = 3200,
1980 		.priority = 3,
1981 		.fixed_size = true,
1982 		.bonus_ways = 0xfffff0,
1983 		.cache_mode = 2,
1984 	}, {
1985 		.usecase_id = LLCC_CAMEXP3,
1986 		.slice_id = 20,
1987 		.max_cap = 3200,
1988 		.priority = 2,
1989 		.fixed_size = true,
1990 		.bonus_ways = 0xfffff0,
1991 		.cache_mode = 2,
1992 	}, {
1993 		.usecase_id = LLCC_CAMEXP4,
1994 		.slice_id = 21,
1995 		.max_cap = 3200,
1996 		.priority = 2,
1997 		.fixed_size = true,
1998 		.bonus_ways = 0xfffff0,
1999 		.cache_mode = 2,
2000 	}, {
2001 		.usecase_id = LLCC_DISP_WB,
2002 		.slice_id = 23,
2003 		.max_cap = 1024,
2004 		.priority = 4,
2005 		.fixed_size = true,
2006 		.bonus_ways = 0xffffff,
2007 		.cache_mode = 0,
2008 	}, {
2009 		.usecase_id = LLCC_DISP_1,
2010 		.slice_id = 24,
2011 		.max_cap = 6144,
2012 		.priority = 1,
2013 		.fixed_size = true,
2014 		.bonus_ways = 0xffffff,
2015 		.cache_mode = 2,
2016 	}, {
2017 		.usecase_id = LLCC_VIDVSP,
2018 		.slice_id = 28,
2019 		.max_cap = 256,
2020 		.priority = 4,
2021 		.fixed_size = true,
2022 		.bonus_ways = 0xffffff,
2023 		.cache_mode = 0,
2024 	},
2025 };
2026 
2027 static const struct llcc_slice_config sm8650_data[] = {
2028 	{
2029 		.usecase_id = LLCC_CPUSS,
2030 		.slice_id = 1,
2031 		.max_cap = 5120,
2032 		.priority = 1,
2033 		.bonus_ways = 0xffffff,
2034 		.cache_mode = 0,
2035 		.activate_on_init = true,
2036 		.stale_en = true,
2037 	}, {
2038 		.usecase_id = LLCC_VIDSC0,
2039 		.slice_id = 2,
2040 		.max_cap = 512,
2041 		.priority = 3,
2042 		.fixed_size = true,
2043 		.bonus_ways = 0xffffff,
2044 		.cache_mode = 0,
2045 	}, {
2046 		.usecase_id = LLCC_AUDIO,
2047 		.slice_id = 6,
2048 		.max_cap = 512,
2049 		.priority = 1,
2050 		.fixed_size = true,
2051 		.bonus_ways = 0xffffff,
2052 		.cache_mode = 0,
2053 	}, {
2054 		.usecase_id = LLCC_MDMHPGRW,
2055 		.slice_id = 25,
2056 		.max_cap = 1024,
2057 		.priority = 3,
2058 		.bonus_ways = 0xffffff,
2059 		.cache_mode = 0,
2060 	}, {
2061 		.usecase_id = LLCC_MODHW,
2062 		.slice_id = 26,
2063 		.max_cap = 1024,
2064 		.priority = 1,
2065 		.fixed_size = true,
2066 		.bonus_ways = 0xffffff,
2067 		.cache_mode = 0,
2068 	}, {
2069 		.usecase_id = LLCC_CMPT,
2070 		.slice_id = 10,
2071 		.max_cap = 4096,
2072 		.priority = 1,
2073 		.fixed_size = true,
2074 		.bonus_ways = 0xffffff,
2075 		.cache_mode = 0,
2076 	}, {
2077 		.usecase_id = LLCC_GPUHTW,
2078 		.slice_id = 11,
2079 		.max_cap = 512,
2080 		.priority = 1,
2081 		.fixed_size = true,
2082 		.bonus_ways = 0xffffff,
2083 		.cache_mode = 0,
2084 	}, {
2085 		.usecase_id = LLCC_GPU,
2086 		.slice_id = 9,
2087 		.max_cap = 3096,
2088 		.priority = 1,
2089 		.bonus_ways = 0xffffff,
2090 		.cache_mode = 0,
2091 		.write_scid_en = true,
2092 		.write_scid_cacheable_en = true,
2093 	}, {
2094 		.usecase_id = LLCC_MMUHWT,
2095 		.slice_id = 18,
2096 		.max_cap = 768,
2097 		.priority = 1,
2098 		.fixed_size = true,
2099 		.bonus_ways = 0xffffff,
2100 		.cache_mode = 0,
2101 		.activate_on_init = true,
2102 	}, {
2103 		.usecase_id = LLCC_DISP,
2104 		.slice_id = 16,
2105 		.max_cap = 6144,
2106 		.priority = 1,
2107 		.fixed_size = true,
2108 		.bonus_ways = 0xffffff,
2109 		.cache_mode = 2,
2110 	}, {
2111 		.usecase_id = LLCC_MDMHPFX,
2112 		.slice_id = 24,
2113 		.max_cap = 1024,
2114 		.priority = 3,
2115 		.fixed_size = true,
2116 		.bonus_ways = 0xffffff,
2117 		.cache_mode = 0,
2118 	}, {
2119 		.usecase_id = LLCC_MDMPNG,
2120 		.slice_id = 27,
2121 		.max_cap = 1024,
2122 		.priority = 0,
2123 		.fixed_size = true,
2124 		.cache_mode = 0,
2125 	}, {
2126 		.usecase_id = LLCC_AUDHW,
2127 		.slice_id = 22,
2128 		.max_cap = 1024,
2129 		.priority = 1,
2130 		.fixed_size = true,
2131 		.bonus_ways = 0xffffff,
2132 		.cache_mode = 0,
2133 	}, {
2134 		.usecase_id = LLCC_CVP,
2135 		.slice_id = 8,
2136 		.max_cap = 256,
2137 		.priority = 3,
2138 		.fixed_size = true,
2139 		.bonus_ways = 0xffffff,
2140 		.cache_mode = 0,
2141 	}, {
2142 		.usecase_id = LLCC_MODPE,
2143 		.slice_id = 29,
2144 		.max_cap = 128,
2145 		.priority = 1,
2146 		.fixed_size = true,
2147 		.bonus_ways = 0xf00000,
2148 		.cache_mode = 0,
2149 		.alloc_oneway_en = true,
2150 	}, {
2151 		.usecase_id = LLCC_WRCACHE,
2152 		.slice_id = 31,
2153 		.max_cap = 512,
2154 		.priority = 1,
2155 		.fixed_size = true,
2156 		.bonus_ways = 0xffffff,
2157 		.cache_mode = 0,
2158 		.activate_on_init = true,
2159 	}, {
2160 		.usecase_id = LLCC_CAMEXP0,
2161 		.slice_id = 4,
2162 		.max_cap = 256,
2163 		.priority = 3,
2164 		.fixed_size = true,
2165 		.bonus_ways = 0xf,
2166 		.cache_mode = 0,
2167 	}, {
2168 		.usecase_id = LLCC_CAMEXP1,
2169 		.slice_id = 7,
2170 		.max_cap = 3200,
2171 		.priority = 3,
2172 		.fixed_size = true,
2173 		.bonus_ways = 0xfffff0,
2174 		.cache_mode = 2,
2175 	}, {
2176 		.usecase_id = LLCC_CMPTHCP,
2177 		.slice_id = 17,
2178 		.max_cap = 256,
2179 		.priority = 3,
2180 		.fixed_size = true,
2181 		.bonus_ways = 0xffffff,
2182 		.cache_mode = 0,
2183 	}, {
2184 		.usecase_id = LLCC_LCPDARE,
2185 		.slice_id = 30,
2186 		.max_cap = 128,
2187 		.priority = 3,
2188 		.fixed_size = true,
2189 		.bonus_ways = 0xffffff,
2190 		.cache_mode = 0,
2191 		.activate_on_init = true,
2192 		.alloc_oneway_en = true,
2193 	}, {
2194 		.usecase_id = LLCC_AENPU,
2195 		.slice_id = 3,
2196 		.max_cap = 3072,
2197 		.priority = 1,
2198 		.fixed_size = true,
2199 		.bonus_ways = 0xffffff,
2200 		.cache_mode = 2,
2201 	}, {
2202 		.usecase_id = LLCC_ISLAND1,
2203 		.slice_id = 12,
2204 		.max_cap = 5888,
2205 		.priority = 7,
2206 		.fixed_size = true,
2207 		.res_ways = 0x7fffff,
2208 		.cache_mode = 0,
2209 	}, {
2210 		.usecase_id = LLCC_DISP_WB,
2211 		.slice_id = 23,
2212 		.max_cap = 1024,
2213 		.priority = 3,
2214 		.fixed_size = true,
2215 		.bonus_ways = 0xffffff,
2216 		.cache_mode = 0,
2217 	}, {
2218 		.usecase_id = LLCC_VIDVSP,
2219 		.slice_id = 28,
2220 		.max_cap = 256,
2221 		.priority = 3,
2222 		.fixed_size = true,
2223 		.bonus_ways = 0xffffff,
2224 		.cache_mode = 0,
2225 	},
2226 };
2227 
2228 static const struct llcc_slice_config qdu1000_data_2ch[] = {
2229 	{
2230 		.usecase_id = LLCC_MDMHPGRW,
2231 		.slice_id = 7,
2232 		.max_cap = 512,
2233 		.priority = 1,
2234 		.fixed_size = true,
2235 		.bonus_ways = 0xfff,
2236 		.cache_mode = 0,
2237 		.retain_on_pc = true,
2238 	}, {
2239 		.usecase_id = LLCC_MODHW,
2240 		.slice_id = 9,
2241 		.max_cap = 256,
2242 		.priority = 1,
2243 		.fixed_size = true,
2244 		.bonus_ways = 0xfff,
2245 		.cache_mode = 0,
2246 		.retain_on_pc = true,
2247 	}, {
2248 		.usecase_id = LLCC_MDMPNG,
2249 		.slice_id = 21,
2250 		.max_cap = 256,
2251 		.priority = 0,
2252 		.fixed_size = true,
2253 		.bonus_ways = 0x3,
2254 		.cache_mode = 0,
2255 		.retain_on_pc = true,
2256 	}, {
2257 		.usecase_id = LLCC_ECC,
2258 		.slice_id = 26,
2259 		.max_cap = 512,
2260 		.priority = 3,
2261 		.fixed_size = true,
2262 		.bonus_ways = 0xffc,
2263 		.cache_mode = 0,
2264 		.activate_on_init = true,
2265 	}, {
2266 		.usecase_id = LLCC_MODPE,
2267 		.slice_id = 29,
2268 		.max_cap = 256,
2269 		.priority = 1,
2270 		.fixed_size = true,
2271 		.bonus_ways = 0xfff,
2272 		.cache_mode = 0,
2273 		.retain_on_pc = true,
2274 	}, {
2275 		.usecase_id = LLCC_APTCM,
2276 		.slice_id = 30,
2277 		.max_cap = 256,
2278 		.priority = 3,
2279 		.fixed_size = true,
2280 		.res_ways = 0xc,
2281 		.cache_mode = 1,
2282 		.retain_on_pc = true,
2283 	}, {
2284 		.usecase_id = LLCC_WRCACHE,
2285 		.slice_id = 31,
2286 		.max_cap = 128,
2287 		.priority = 1,
2288 		.fixed_size = true,
2289 		.bonus_ways = 0x3,
2290 		.cache_mode = 0,
2291 		.activate_on_init = true,
2292 	},
2293 };
2294 
2295 static const struct llcc_slice_config qdu1000_data_4ch[] = {
2296 	{
2297 		.usecase_id = LLCC_MDMHPGRW,
2298 		.slice_id = 7,
2299 		.max_cap = 1024,
2300 		.priority = 1,
2301 		.fixed_size = true,
2302 		.bonus_ways = 0xfff,
2303 		.cache_mode = 0,
2304 		.retain_on_pc = true,
2305 	}, {
2306 		.usecase_id = LLCC_MODHW,
2307 		.slice_id = 9,
2308 		.max_cap = 512,
2309 		.priority = 1,
2310 		.fixed_size = true,
2311 		.bonus_ways = 0xfff,
2312 		.cache_mode = 0,
2313 		.retain_on_pc = true,
2314 	}, {
2315 		.usecase_id = LLCC_MDMPNG,
2316 		.slice_id = 21,
2317 		.max_cap = 512,
2318 		.priority = 0,
2319 		.fixed_size = true,
2320 		.bonus_ways = 0x3,
2321 		.cache_mode = 0,
2322 		.retain_on_pc = true,
2323 	}, {
2324 		.usecase_id = LLCC_ECC,
2325 		.slice_id = 26,
2326 		.max_cap = 1024,
2327 		.priority = 3,
2328 		.fixed_size = true,
2329 		.bonus_ways = 0xffc,
2330 		.cache_mode = 0,
2331 		.activate_on_init = true,
2332 	}, {
2333 		.usecase_id = LLCC_MODPE,
2334 		.slice_id = 29,
2335 		.max_cap = 512,
2336 		.priority = 1,
2337 		.fixed_size = true,
2338 		.bonus_ways = 0xfff,
2339 		.cache_mode = 0,
2340 		.retain_on_pc = true,
2341 	}, {
2342 		.usecase_id = LLCC_APTCM,
2343 		.slice_id = 30,
2344 		.max_cap = 512,
2345 		.priority = 3,
2346 		.fixed_size = true,
2347 		.res_ways = 0xc,
2348 		.cache_mode = 1,
2349 		.retain_on_pc = true,
2350 	}, {
2351 		.usecase_id = LLCC_WRCACHE,
2352 		.slice_id = 31,
2353 		.max_cap = 256,
2354 		.priority = 1,
2355 		.fixed_size = true,
2356 		.bonus_ways = 0x3,
2357 		.cache_mode = 0,
2358 		.activate_on_init = true,
2359 	},
2360 };
2361 
2362 static const struct llcc_slice_config qdu1000_data_8ch[] = {
2363 	{
2364 		.usecase_id = LLCC_MDMHPGRW,
2365 		.slice_id = 7,
2366 		.max_cap = 2048,
2367 		.priority = 1,
2368 		.fixed_size = true,
2369 		.bonus_ways = 0xfff,
2370 		.cache_mode = 0,
2371 		.retain_on_pc = true,
2372 	}, {
2373 		.usecase_id = LLCC_MODHW,
2374 		.slice_id = 9,
2375 		.max_cap = 1024,
2376 		.priority = 1,
2377 		.fixed_size = true,
2378 		.bonus_ways = 0xfff,
2379 		.cache_mode = 0,
2380 		.retain_on_pc = true,
2381 	}, {
2382 		.usecase_id = LLCC_MDMPNG,
2383 		.slice_id = 21,
2384 		.max_cap = 1024,
2385 		.priority = 0,
2386 		.fixed_size = true,
2387 		.bonus_ways = 0x3,
2388 		.cache_mode = 0,
2389 		.retain_on_pc = true,
2390 	}, {
2391 		.usecase_id = LLCC_ECC,
2392 		.slice_id = 26,
2393 		.max_cap = 2048,
2394 		.priority = 3,
2395 		.fixed_size = true,
2396 		.bonus_ways = 0xffc,
2397 		.cache_mode = 0,
2398 		.activate_on_init = true,
2399 	}, {
2400 		.usecase_id = LLCC_MODPE,
2401 		.slice_id = 29,
2402 		.max_cap = 1024,
2403 		.priority = 1,
2404 		.fixed_size = true,
2405 		.bonus_ways = 0xfff,
2406 		.cache_mode = 0,
2407 		.retain_on_pc = true,
2408 	}, {
2409 		.usecase_id = LLCC_APTCM,
2410 		.slice_id = 30,
2411 		.max_cap = 1024,
2412 		.priority = 3,
2413 		.fixed_size = true,
2414 		.res_ways = 0xc,
2415 		.cache_mode = 1,
2416 		.retain_on_pc = true,
2417 	}, {
2418 		.usecase_id = LLCC_WRCACHE,
2419 		.slice_id = 31,
2420 		.max_cap = 512,
2421 		.priority = 1,
2422 		.fixed_size = true,
2423 		.bonus_ways = 0x3,
2424 		.cache_mode = 0,
2425 		.activate_on_init = true,
2426 	},
2427 };
2428 
2429 static const struct llcc_slice_config x1e80100_data[] = {
2430 	{
2431 		.usecase_id = LLCC_CPUSS,
2432 		.slice_id = 1,
2433 		.max_cap = 6144,
2434 		.priority = 1,
2435 		.fixed_size = true,
2436 		.bonus_ways = 0xfff,
2437 		.cache_mode = 0,
2438 		.activate_on_init = true,
2439 	}, {
2440 		.usecase_id = LLCC_VIDSC0,
2441 		.slice_id = 2,
2442 		.max_cap = 512,
2443 		.priority = 4,
2444 		.fixed_size = true,
2445 		.bonus_ways = 0xfff,
2446 		.cache_mode = 0,
2447 	}, {
2448 		.usecase_id = LLCC_AUDIO,
2449 		.slice_id = 6,
2450 		.max_cap = 1024,
2451 		.priority = 1,
2452 		.fixed_size = true,
2453 		.bonus_ways = 0xfff,
2454 		.cache_mode = 0,
2455 	}, {
2456 		.usecase_id = LLCC_CMPT,
2457 		.slice_id = 10,
2458 		.max_cap = 6144,
2459 		.priority = 1,
2460 		.fixed_size = true,
2461 		.bonus_ways = 0xfff,
2462 		.cache_mode = 0,
2463 	}, {
2464 		.usecase_id = LLCC_GPUHTW,
2465 		.slice_id = 11,
2466 		.max_cap = 512,
2467 		.priority = 1,
2468 		.fixed_size = true,
2469 		.bonus_ways = 0xfff,
2470 		.cache_mode = 0,
2471 	}, {
2472 		.usecase_id = LLCC_GPU,
2473 		.slice_id = 9,
2474 		.max_cap = 4608,
2475 		.priority = 1,
2476 		.bonus_ways = 0xfff,
2477 		.cache_mode = 0,
2478 		.write_scid_en = true,
2479 		.write_scid_cacheable_en = true,
2480 		.stale_en = true,
2481 	}, {
2482 		.usecase_id = LLCC_MMUHWT,
2483 		.slice_id = 18,
2484 		.max_cap = 512,
2485 		.priority = 1,
2486 		.fixed_size = true,
2487 		.bonus_ways = 0xfff,
2488 		.cache_mode = 0,
2489 		.activate_on_init = true,
2490 	}, {
2491 		.usecase_id = LLCC_AUDHW,
2492 		.slice_id = 22,
2493 		.max_cap = 1024,
2494 		.priority = 1,
2495 		.fixed_size = true,
2496 		.bonus_ways = 0xfff,
2497 		.cache_mode = 0,
2498 	}, {
2499 		.usecase_id = LLCC_CVP,
2500 		.slice_id = 8,
2501 		.max_cap = 512,
2502 		.priority = 4,
2503 		.fixed_size = true,
2504 		.bonus_ways = 0xfff,
2505 		.cache_mode = 0,
2506 	}, {
2507 		.usecase_id = LLCC_WRCACHE,
2508 		.slice_id = 31,
2509 		.max_cap = 1024,
2510 		.priority = 1,
2511 		.fixed_size = true,
2512 		.bonus_ways = 0xfff,
2513 		.cache_mode = 0,
2514 		.activate_on_init = true,
2515 	}, {
2516 		.usecase_id = LLCC_CAMEXP0,
2517 		.slice_id = 4,
2518 		.max_cap = 256,
2519 		.priority = 4,
2520 		.fixed_size = true,
2521 		.bonus_ways = 0x3,
2522 		.cache_mode = 0,
2523 	}, {
2524 		.usecase_id = LLCC_CAMEXP1,
2525 		.slice_id = 7,
2526 		.max_cap = 3072,
2527 		.priority = 3,
2528 		.fixed_size = true,
2529 		.bonus_ways = 0xffc,
2530 		.cache_mode = 2,
2531 	}, {
2532 		.usecase_id = LLCC_LCPDARE,
2533 		.slice_id = 30,
2534 		.max_cap = 512,
2535 		.priority = 3,
2536 		.fixed_size = true,
2537 		.bonus_ways = 0xfff,
2538 		.cache_mode = 0,
2539 		.activate_on_init = true,
2540 		.alloc_oneway_en = true,
2541 	}, {
2542 		.usecase_id = LLCC_AENPU,
2543 		.slice_id = 3,
2544 		.max_cap = 3072,
2545 		.priority = 1,
2546 		.fixed_size = true,
2547 		.bonus_ways = 0xfff,
2548 		.cache_mode = 2,
2549 	}, {
2550 		.usecase_id = LLCC_ISLAND1,
2551 		.slice_id = 12,
2552 		.max_cap = 2048,
2553 		.priority = 7,
2554 		.fixed_size = true,
2555 		.res_ways = 0xf,
2556 		.cache_mode = 0,
2557 	}, {
2558 		.usecase_id = LLCC_CAMEXP2,
2559 		.slice_id = 19,
2560 		.max_cap = 3072,
2561 		.priority = 3,
2562 		.fixed_size = true,
2563 		.bonus_ways = 0xffc,
2564 		.cache_mode = 2,
2565 	}, {
2566 		.usecase_id = LLCC_CAMEXP3,
2567 		.slice_id = 20,
2568 		.max_cap = 3072,
2569 		.priority = 2,
2570 		.fixed_size = true,
2571 		.bonus_ways = 0xffc,
2572 		.cache_mode = 2,
2573 	}, {
2574 		.usecase_id = LLCC_CAMEXP4,
2575 		.slice_id = 21,
2576 		.max_cap = 3072,
2577 		.priority = 2,
2578 		.fixed_size = true,
2579 		.bonus_ways = 0xffc,
2580 		.cache_mode = 2,
2581 	},
2582 };
2583 
2584 static const struct llcc_edac_reg_offset llcc_v1_edac_reg_offset = {
2585 	.trp_ecc_error_status0 = 0x20344,
2586 	.trp_ecc_error_status1 = 0x20348,
2587 	.trp_ecc_sb_err_syn0 = 0x2304c,
2588 	.trp_ecc_db_err_syn0 = 0x20370,
2589 	.trp_ecc_error_cntr_clear = 0x20440,
2590 	.trp_interrupt_0_status = 0x20480,
2591 	.trp_interrupt_0_clear = 0x20484,
2592 	.trp_interrupt_0_enable = 0x20488,
2593 
2594 	/* LLCC Common registers */
2595 	.cmn_status0 = 0x3000c,
2596 	.cmn_interrupt_0_enable = 0x3001c,
2597 	.cmn_interrupt_2_enable = 0x3003c,
2598 
2599 	/* LLCC DRP registers */
2600 	.drp_ecc_error_cfg = 0x40000,
2601 	.drp_ecc_error_cntr_clear = 0x40004,
2602 	.drp_interrupt_status = 0x41000,
2603 	.drp_interrupt_clear = 0x41008,
2604 	.drp_interrupt_enable = 0x4100c,
2605 	.drp_ecc_error_status0 = 0x42044,
2606 	.drp_ecc_error_status1 = 0x42048,
2607 	.drp_ecc_sb_err_syn0 = 0x4204c,
2608 	.drp_ecc_db_err_syn0 = 0x42070,
2609 };
2610 
2611 static const struct llcc_edac_reg_offset llcc_v2_1_edac_reg_offset = {
2612 	.trp_ecc_error_status0 = 0x20344,
2613 	.trp_ecc_error_status1 = 0x20348,
2614 	.trp_ecc_sb_err_syn0 = 0x2034c,
2615 	.trp_ecc_db_err_syn0 = 0x20370,
2616 	.trp_ecc_error_cntr_clear = 0x20440,
2617 	.trp_interrupt_0_status = 0x20480,
2618 	.trp_interrupt_0_clear = 0x20484,
2619 	.trp_interrupt_0_enable = 0x20488,
2620 
2621 	/* LLCC Common registers */
2622 	.cmn_status0 = 0x3400c,
2623 	.cmn_interrupt_0_enable = 0x3401c,
2624 	.cmn_interrupt_2_enable = 0x3403c,
2625 
2626 	/* LLCC DRP registers */
2627 	.drp_ecc_error_cfg = 0x50000,
2628 	.drp_ecc_error_cntr_clear = 0x50004,
2629 	.drp_interrupt_status = 0x50020,
2630 	.drp_interrupt_clear = 0x50028,
2631 	.drp_interrupt_enable = 0x5002c,
2632 	.drp_ecc_error_status0 = 0x520f4,
2633 	.drp_ecc_error_status1 = 0x520f8,
2634 	.drp_ecc_sb_err_syn0 = 0x520fc,
2635 	.drp_ecc_db_err_syn0 = 0x52120,
2636 };
2637 
2638 /* LLCC register offset starting from v1.0.0 */
2639 static const u32 llcc_v1_reg_offset[] = {
2640 	[LLCC_COMMON_HW_INFO]	= 0x00030000,
2641 	[LLCC_COMMON_STATUS0]	= 0x0003000c,
2642 };
2643 
2644 /* LLCC register offset starting from v2.0.1 */
2645 static const u32 llcc_v2_1_reg_offset[] = {
2646 	[LLCC_COMMON_HW_INFO]	= 0x00034000,
2647 	[LLCC_COMMON_STATUS0]	= 0x0003400c,
2648 };
2649 
2650 static const struct qcom_llcc_config qdu1000_cfg[] = {
2651 	{
2652 		.sct_data       = qdu1000_data_8ch,
2653 		.size		= ARRAY_SIZE(qdu1000_data_8ch),
2654 		.need_llcc_cfg	= true,
2655 		.reg_offset	= llcc_v2_1_reg_offset,
2656 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2657 	},
2658 	{
2659 		.sct_data       = qdu1000_data_4ch,
2660 		.size           = ARRAY_SIZE(qdu1000_data_4ch),
2661 		.need_llcc_cfg  = true,
2662 		.reg_offset     = llcc_v2_1_reg_offset,
2663 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2664 	},
2665 	{
2666 		.sct_data       = qdu1000_data_4ch,
2667 		.size           = ARRAY_SIZE(qdu1000_data_4ch),
2668 		.need_llcc_cfg  = true,
2669 		.reg_offset     = llcc_v2_1_reg_offset,
2670 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2671 	},
2672 	{
2673 		.sct_data       = qdu1000_data_2ch,
2674 		.size           = ARRAY_SIZE(qdu1000_data_2ch),
2675 		.need_llcc_cfg  = true,
2676 		.reg_offset     = llcc_v2_1_reg_offset,
2677 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2678 	},
2679 };
2680 
2681 static const struct qcom_llcc_config sa8775p_cfg[] = {
2682 	{
2683 		.sct_data	= sa8775p_data,
2684 		.size		= ARRAY_SIZE(sa8775p_data),
2685 		.need_llcc_cfg	= true,
2686 		.reg_offset	= llcc_v2_1_reg_offset,
2687 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2688 	},
2689 };
2690 
2691 static const struct qcom_llcc_config sc7180_cfg[] = {
2692 	{
2693 		.sct_data	= sc7180_data,
2694 		.size		= ARRAY_SIZE(sc7180_data),
2695 		.need_llcc_cfg	= true,
2696 		.reg_offset	= llcc_v1_reg_offset,
2697 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2698 	},
2699 };
2700 
2701 static const struct qcom_llcc_config sc7280_cfg[] = {
2702 	{
2703 		.sct_data	= sc7280_data,
2704 		.size		= ARRAY_SIZE(sc7280_data),
2705 		.need_llcc_cfg	= true,
2706 		.reg_offset	= llcc_v1_reg_offset,
2707 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2708 	},
2709 };
2710 
2711 static const struct qcom_llcc_config sc8180x_cfg[] = {
2712 	{
2713 		.sct_data	= sc8180x_data,
2714 		.size		= ARRAY_SIZE(sc8180x_data),
2715 		.need_llcc_cfg	= true,
2716 		.reg_offset	= llcc_v1_reg_offset,
2717 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2718 	},
2719 };
2720 
2721 static const struct qcom_llcc_config sc8280xp_cfg[] = {
2722 	{
2723 		.sct_data	= sc8280xp_data,
2724 		.size		= ARRAY_SIZE(sc8280xp_data),
2725 		.need_llcc_cfg	= true,
2726 		.reg_offset	= llcc_v1_reg_offset,
2727 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2728 	},
2729 };
2730 
2731 static const struct qcom_llcc_config sdm845_cfg[] = {
2732 	{
2733 		.sct_data	= sdm845_data,
2734 		.size		= ARRAY_SIZE(sdm845_data),
2735 		.need_llcc_cfg	= false,
2736 		.reg_offset	= llcc_v1_reg_offset,
2737 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2738 		.no_edac	= true,
2739 	},
2740 };
2741 
2742 static const struct qcom_llcc_config sm6350_cfg[] = {
2743 	{
2744 		.sct_data	= sm6350_data,
2745 		.size		= ARRAY_SIZE(sm6350_data),
2746 		.need_llcc_cfg	= true,
2747 		.reg_offset	= llcc_v1_reg_offset,
2748 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2749 	},
2750 };
2751 
2752 static const struct qcom_llcc_config sm7150_cfg[] = {
2753 	{
2754 		.sct_data       = sm7150_data,
2755 		.size           = ARRAY_SIZE(sm7150_data),
2756 		.need_llcc_cfg	= true,
2757 		.reg_offset	= llcc_v1_reg_offset,
2758 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2759 	},
2760 };
2761 
2762 static const struct qcom_llcc_config sm8150_cfg[] = {
2763 	{
2764 		.sct_data       = sm8150_data,
2765 		.size           = ARRAY_SIZE(sm8150_data),
2766 		.need_llcc_cfg	= true,
2767 		.reg_offset	= llcc_v1_reg_offset,
2768 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2769 	},
2770 };
2771 
2772 static const struct qcom_llcc_config sm8250_cfg[] = {
2773 	{
2774 		.sct_data       = sm8250_data,
2775 		.size           = ARRAY_SIZE(sm8250_data),
2776 		.need_llcc_cfg	= true,
2777 		.reg_offset	= llcc_v1_reg_offset,
2778 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2779 	},
2780 };
2781 
2782 static const struct qcom_llcc_config sm8350_cfg[] = {
2783 	{
2784 		.sct_data       = sm8350_data,
2785 		.size           = ARRAY_SIZE(sm8350_data),
2786 		.need_llcc_cfg	= true,
2787 		.reg_offset	= llcc_v1_reg_offset,
2788 		.edac_reg_offset = &llcc_v1_edac_reg_offset,
2789 	},
2790 };
2791 
2792 static const struct qcom_llcc_config sm8450_cfg[] = {
2793 	{
2794 		.sct_data       = sm8450_data,
2795 		.size           = ARRAY_SIZE(sm8450_data),
2796 		.need_llcc_cfg	= true,
2797 		.reg_offset	= llcc_v2_1_reg_offset,
2798 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2799 	},
2800 };
2801 
2802 static const struct qcom_llcc_config sm8550_cfg[] = {
2803 	{
2804 		.sct_data       = sm8550_data,
2805 		.size           = ARRAY_SIZE(sm8550_data),
2806 		.need_llcc_cfg	= true,
2807 		.reg_offset	= llcc_v2_1_reg_offset,
2808 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2809 	},
2810 };
2811 
2812 static const struct qcom_llcc_config sm8650_cfg[] = {
2813 	{
2814 		.sct_data       = sm8650_data,
2815 		.size           = ARRAY_SIZE(sm8650_data),
2816 		.need_llcc_cfg	= true,
2817 		.reg_offset	= llcc_v2_1_reg_offset,
2818 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2819 	},
2820 };
2821 
2822 static const struct qcom_llcc_config x1e80100_cfg[] = {
2823 	{
2824 		.sct_data	= x1e80100_data,
2825 		.size		= ARRAY_SIZE(x1e80100_data),
2826 		.need_llcc_cfg	= true,
2827 		.reg_offset	= llcc_v2_1_reg_offset,
2828 		.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
2829 		.irq_configured = true,
2830 	},
2831 };
2832 
2833 static const struct qcom_sct_config qdu1000_cfgs = {
2834 	.llcc_config	= qdu1000_cfg,
2835 	.num_config	= ARRAY_SIZE(qdu1000_cfg),
2836 };
2837 
2838 static const struct qcom_sct_config sa8775p_cfgs = {
2839 	.llcc_config	= sa8775p_cfg,
2840 	.num_config	= ARRAY_SIZE(sa8775p_cfg),
2841 };
2842 
2843 static const struct qcom_sct_config sc7180_cfgs = {
2844 	.llcc_config	= sc7180_cfg,
2845 	.num_config	= ARRAY_SIZE(sc7180_cfg),
2846 };
2847 
2848 static const struct qcom_sct_config sc7280_cfgs = {
2849 	.llcc_config	= sc7280_cfg,
2850 	.num_config	= ARRAY_SIZE(sc7280_cfg),
2851 };
2852 
2853 static const struct qcom_sct_config sc8180x_cfgs = {
2854 	.llcc_config	= sc8180x_cfg,
2855 	.num_config	= ARRAY_SIZE(sc8180x_cfg),
2856 };
2857 
2858 static const struct qcom_sct_config sc8280xp_cfgs = {
2859 	.llcc_config	= sc8280xp_cfg,
2860 	.num_config	= ARRAY_SIZE(sc8280xp_cfg),
2861 };
2862 
2863 static const struct qcom_sct_config sdm845_cfgs = {
2864 	.llcc_config	= sdm845_cfg,
2865 	.num_config	= ARRAY_SIZE(sdm845_cfg),
2866 };
2867 
2868 static const struct qcom_sct_config sm6350_cfgs = {
2869 	.llcc_config	= sm6350_cfg,
2870 	.num_config	= ARRAY_SIZE(sm6350_cfg),
2871 };
2872 
2873 static const struct qcom_sct_config sm7150_cfgs = {
2874 	.llcc_config	= sm7150_cfg,
2875 	.num_config	= ARRAY_SIZE(sm7150_cfg),
2876 };
2877 
2878 static const struct qcom_sct_config sm8150_cfgs = {
2879 	.llcc_config	= sm8150_cfg,
2880 	.num_config	= ARRAY_SIZE(sm8150_cfg),
2881 };
2882 
2883 static const struct qcom_sct_config sm8250_cfgs = {
2884 	.llcc_config	= sm8250_cfg,
2885 	.num_config	= ARRAY_SIZE(sm8250_cfg),
2886 };
2887 
2888 static const struct qcom_sct_config sm8350_cfgs = {
2889 	.llcc_config	= sm8350_cfg,
2890 	.num_config	= ARRAY_SIZE(sm8350_cfg),
2891 };
2892 
2893 static const struct qcom_sct_config sm8450_cfgs = {
2894 	.llcc_config	= sm8450_cfg,
2895 	.num_config	= ARRAY_SIZE(sm8450_cfg),
2896 };
2897 
2898 static const struct qcom_sct_config sm8550_cfgs = {
2899 	.llcc_config	= sm8550_cfg,
2900 	.num_config	= ARRAY_SIZE(sm8550_cfg),
2901 };
2902 
2903 static const struct qcom_sct_config sm8650_cfgs = {
2904 	.llcc_config	= sm8650_cfg,
2905 	.num_config	= ARRAY_SIZE(sm8650_cfg),
2906 };
2907 
2908 static const struct qcom_sct_config x1e80100_cfgs = {
2909 	.llcc_config	= x1e80100_cfg,
2910 	.num_config	= ARRAY_SIZE(x1e80100_cfg),
2911 };
2912 
2913 static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER;
2914 
2915 /**
2916  * llcc_slice_getd - get llcc slice descriptor
2917  * @uid: usecase_id for the client
2918  *
2919  * A pointer to llcc slice descriptor will be returned on success
2920  * and error pointer is returned on failure
2921  */
llcc_slice_getd(u32 uid)2922 struct llcc_slice_desc *llcc_slice_getd(u32 uid)
2923 {
2924 	const struct llcc_slice_config *cfg;
2925 	struct llcc_slice_desc *desc;
2926 	u32 sz, count;
2927 
2928 	if (IS_ERR(drv_data))
2929 		return ERR_CAST(drv_data);
2930 
2931 	cfg = drv_data->cfg;
2932 	sz = drv_data->cfg_size;
2933 
2934 	for (count = 0; cfg && count < sz; count++, cfg++)
2935 		if (cfg->usecase_id == uid)
2936 			break;
2937 
2938 	if (count == sz || !cfg)
2939 		return ERR_PTR(-ENODEV);
2940 
2941 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
2942 	if (!desc)
2943 		return ERR_PTR(-ENOMEM);
2944 
2945 	desc->slice_id = cfg->slice_id;
2946 	desc->slice_size = cfg->max_cap;
2947 
2948 	return desc;
2949 }
2950 EXPORT_SYMBOL_GPL(llcc_slice_getd);
2951 
2952 /**
2953  * llcc_slice_putd - llcc slice descriptor
2954  * @desc: Pointer to llcc slice descriptor
2955  */
llcc_slice_putd(struct llcc_slice_desc * desc)2956 void llcc_slice_putd(struct llcc_slice_desc *desc)
2957 {
2958 	if (!IS_ERR_OR_NULL(desc))
2959 		kfree(desc);
2960 }
2961 EXPORT_SYMBOL_GPL(llcc_slice_putd);
2962 
llcc_update_act_ctrl(u32 sid,u32 act_ctrl_reg_val,u32 status)2963 static int llcc_update_act_ctrl(u32 sid,
2964 				u32 act_ctrl_reg_val, u32 status)
2965 {
2966 	struct regmap *regmap;
2967 	u32 act_ctrl_reg;
2968 	u32 act_clear_reg;
2969 	u32 status_reg;
2970 	u32 slice_status;
2971 	int ret;
2972 
2973 	if (IS_ERR(drv_data))
2974 		return PTR_ERR(drv_data);
2975 
2976 	act_ctrl_reg = LLCC_TRP_ACT_CTRLn(sid);
2977 	act_clear_reg = LLCC_TRP_ACT_CLEARn(sid);
2978 	status_reg = LLCC_TRP_STATUSn(sid);
2979 
2980 	/* Set the ACTIVE trigger */
2981 	act_ctrl_reg_val |= ACT_CTRL_ACT_TRIG;
2982 	ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg,
2983 				act_ctrl_reg_val);
2984 	if (ret)
2985 		return ret;
2986 
2987 	/* Clear the ACTIVE trigger */
2988 	act_ctrl_reg_val &= ~ACT_CTRL_ACT_TRIG;
2989 	ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg,
2990 				act_ctrl_reg_val);
2991 	if (ret)
2992 		return ret;
2993 
2994 	if (drv_data->version >= LLCC_VERSION_4_1_0_0) {
2995 		regmap = drv_data->bcast_and_regmap ?: drv_data->bcast_regmap;
2996 		ret = regmap_read_poll_timeout(regmap, status_reg,
2997 				      slice_status, (slice_status & ACT_COMPLETE),
2998 				      0, LLCC_STATUS_READ_DELAY);
2999 		if (ret)
3000 			return ret;
3001 	}
3002 
3003 	ret = regmap_read_poll_timeout(drv_data->bcast_regmap, status_reg,
3004 				      slice_status, !(slice_status & status),
3005 				      0, LLCC_STATUS_READ_DELAY);
3006 	if (ret)
3007 		return ret;
3008 
3009 	if (drv_data->version >= LLCC_VERSION_4_1_0_0)
3010 		ret = regmap_write(drv_data->bcast_regmap, act_clear_reg,
3011 					ACT_CLEAR);
3012 
3013 	return ret;
3014 }
3015 
3016 /**
3017  * llcc_slice_activate - Activate the llcc slice
3018  * @desc: Pointer to llcc slice descriptor
3019  *
3020  * A value of zero will be returned on success and a negative errno will
3021  * be returned in error cases
3022  */
llcc_slice_activate(struct llcc_slice_desc * desc)3023 int llcc_slice_activate(struct llcc_slice_desc *desc)
3024 {
3025 	int ret;
3026 	u32 act_ctrl_val;
3027 
3028 	if (IS_ERR(drv_data))
3029 		return PTR_ERR(drv_data);
3030 
3031 	if (IS_ERR_OR_NULL(desc))
3032 		return -EINVAL;
3033 
3034 	mutex_lock(&drv_data->lock);
3035 	if (test_bit(desc->slice_id, drv_data->bitmap)) {
3036 		mutex_unlock(&drv_data->lock);
3037 		return 0;
3038 	}
3039 
3040 	act_ctrl_val = ACT_CTRL_OPCODE_ACTIVATE << ACT_CTRL_OPCODE_SHIFT;
3041 
3042 	ret = llcc_update_act_ctrl(desc->slice_id, act_ctrl_val,
3043 				  DEACTIVATE);
3044 	if (ret) {
3045 		mutex_unlock(&drv_data->lock);
3046 		return ret;
3047 	}
3048 
3049 	__set_bit(desc->slice_id, drv_data->bitmap);
3050 	mutex_unlock(&drv_data->lock);
3051 
3052 	return ret;
3053 }
3054 EXPORT_SYMBOL_GPL(llcc_slice_activate);
3055 
3056 /**
3057  * llcc_slice_deactivate - Deactivate the llcc slice
3058  * @desc: Pointer to llcc slice descriptor
3059  *
3060  * A value of zero will be returned on success and a negative errno will
3061  * be returned in error cases
3062  */
llcc_slice_deactivate(struct llcc_slice_desc * desc)3063 int llcc_slice_deactivate(struct llcc_slice_desc *desc)
3064 {
3065 	u32 act_ctrl_val;
3066 	int ret;
3067 
3068 	if (IS_ERR(drv_data))
3069 		return PTR_ERR(drv_data);
3070 
3071 	if (IS_ERR_OR_NULL(desc))
3072 		return -EINVAL;
3073 
3074 	mutex_lock(&drv_data->lock);
3075 	if (!test_bit(desc->slice_id, drv_data->bitmap)) {
3076 		mutex_unlock(&drv_data->lock);
3077 		return 0;
3078 	}
3079 	act_ctrl_val = ACT_CTRL_OPCODE_DEACTIVATE << ACT_CTRL_OPCODE_SHIFT;
3080 
3081 	ret = llcc_update_act_ctrl(desc->slice_id, act_ctrl_val,
3082 				  ACTIVATE);
3083 	if (ret) {
3084 		mutex_unlock(&drv_data->lock);
3085 		return ret;
3086 	}
3087 
3088 	__clear_bit(desc->slice_id, drv_data->bitmap);
3089 	mutex_unlock(&drv_data->lock);
3090 
3091 	return ret;
3092 }
3093 EXPORT_SYMBOL_GPL(llcc_slice_deactivate);
3094 
3095 /**
3096  * llcc_get_slice_id - return the slice id
3097  * @desc: Pointer to llcc slice descriptor
3098  */
llcc_get_slice_id(struct llcc_slice_desc * desc)3099 int llcc_get_slice_id(struct llcc_slice_desc *desc)
3100 {
3101 	if (IS_ERR_OR_NULL(desc))
3102 		return -EINVAL;
3103 
3104 	return desc->slice_id;
3105 }
3106 EXPORT_SYMBOL_GPL(llcc_get_slice_id);
3107 
3108 /**
3109  * llcc_get_slice_size - return the slice id
3110  * @desc: Pointer to llcc slice descriptor
3111  */
llcc_get_slice_size(struct llcc_slice_desc * desc)3112 size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
3113 {
3114 	if (IS_ERR_OR_NULL(desc))
3115 		return 0;
3116 
3117 	return desc->slice_size;
3118 }
3119 EXPORT_SYMBOL_GPL(llcc_get_slice_size);
3120 
_qcom_llcc_cfg_program(const struct llcc_slice_config * config,const struct qcom_llcc_config * cfg)3121 static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config,
3122 				  const struct qcom_llcc_config *cfg)
3123 {
3124 	int ret;
3125 	u32 attr2_cfg;
3126 	u32 attr1_cfg;
3127 	u32 attr0_cfg;
3128 	u32 attr2_val;
3129 	u32 attr1_val;
3130 	u32 attr0_val;
3131 	u32 max_cap_cacheline;
3132 	struct llcc_slice_desc desc;
3133 
3134 	attr1_val = config->cache_mode;
3135 	attr1_val |= config->probe_target_ways << ATTR1_PROBE_TARGET_WAYS_SHIFT;
3136 	attr1_val |= config->fixed_size << ATTR1_FIXED_SIZE_SHIFT;
3137 	attr1_val |= config->priority << ATTR1_PRIORITY_SHIFT;
3138 
3139 	max_cap_cacheline = MAX_CAP_TO_BYTES(config->max_cap);
3140 
3141 	/*
3142 	 * LLCC instances can vary for each target.
3143 	 * The SW writes to broadcast register which gets propagated
3144 	 * to each llcc instance (llcc0,.. llccN).
3145 	 * Since the size of the memory is divided equally amongst the
3146 	 * llcc instances, we need to configure the max cap accordingly.
3147 	 */
3148 	max_cap_cacheline = max_cap_cacheline / drv_data->num_banks;
3149 	max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT;
3150 	attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT;
3151 
3152 	attr1_cfg = LLCC_TRP_ATTR1_CFGn(config->slice_id);
3153 
3154 	ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, attr1_val);
3155 	if (ret)
3156 		return ret;
3157 
3158 	if (drv_data->version >= LLCC_VERSION_4_1_0_0) {
3159 		attr2_cfg = LLCC_TRP_ATTR2_CFGn(config->slice_id);
3160 		attr0_val = config->res_ways;
3161 		attr2_val = config->bonus_ways;
3162 	} else {
3163 		attr0_val = config->res_ways & ATTR0_RES_WAYS_MASK;
3164 		attr0_val |= config->bonus_ways << ATTR0_BONUS_WAYS_SHIFT;
3165 	}
3166 
3167 	attr0_cfg = LLCC_TRP_ATTR0_CFGn(config->slice_id);
3168 
3169 	ret = regmap_write(drv_data->bcast_regmap, attr0_cfg, attr0_val);
3170 	if (ret)
3171 		return ret;
3172 
3173 	if (drv_data->version >= LLCC_VERSION_4_1_0_0) {
3174 		ret = regmap_write(drv_data->bcast_regmap, attr2_cfg, attr2_val);
3175 		if (ret)
3176 			return ret;
3177 	}
3178 
3179 	if (cfg->need_llcc_cfg) {
3180 		u32 disable_cap_alloc, retain_pc;
3181 
3182 		disable_cap_alloc = config->dis_cap_alloc << config->slice_id;
3183 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_SCID_DIS_CAP_ALLOC,
3184 					 BIT(config->slice_id), disable_cap_alloc);
3185 		if (ret)
3186 			return ret;
3187 
3188 		if (drv_data->version < LLCC_VERSION_4_1_0_0) {
3189 			retain_pc = config->retain_on_pc << config->slice_id;
3190 			ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_PCB_ACT,
3191 						 BIT(config->slice_id), retain_pc);
3192 			if (ret)
3193 				return ret;
3194 		}
3195 	}
3196 
3197 	if (drv_data->version >= LLCC_VERSION_2_0_0_0) {
3198 		u32 wren;
3199 
3200 		wren = config->write_scid_en << config->slice_id;
3201 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_WRSC_EN,
3202 					 BIT(config->slice_id), wren);
3203 		if (ret)
3204 			return ret;
3205 	}
3206 
3207 	if (drv_data->version >= LLCC_VERSION_2_1_0_0) {
3208 		u32 wr_cache_en;
3209 
3210 		wr_cache_en = config->write_scid_cacheable_en << config->slice_id;
3211 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_WRSC_CACHEABLE_EN,
3212 					 BIT(config->slice_id), wr_cache_en);
3213 		if (ret)
3214 			return ret;
3215 	}
3216 
3217 	if (drv_data->version >= LLCC_VERSION_4_1_0_0) {
3218 		u32 stale_en;
3219 		u32 stale_cap_en;
3220 		u32 mru_uncap_en;
3221 		u32 mru_rollover;
3222 		u32 alloc_oneway_en;
3223 		u32 ovcap_en;
3224 		u32 ovcap_prio;
3225 		u32 vict_prio;
3226 
3227 		stale_en = config->stale_en << config->slice_id;
3228 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG1,
3229 					 BIT(config->slice_id), stale_en);
3230 		if (ret)
3231 			return ret;
3232 
3233 		stale_cap_en = config->stale_cap_en << config->slice_id;
3234 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG2,
3235 					 BIT(config->slice_id), stale_cap_en);
3236 		if (ret)
3237 			return ret;
3238 
3239 		mru_uncap_en = config->mru_uncap_en << config->slice_id;
3240 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG3,
3241 					 BIT(config->slice_id), mru_uncap_en);
3242 		if (ret)
3243 			return ret;
3244 
3245 		mru_rollover = config->mru_rollover << config->slice_id;
3246 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG4,
3247 					 BIT(config->slice_id), mru_rollover);
3248 		if (ret)
3249 			return ret;
3250 
3251 		alloc_oneway_en = config->alloc_oneway_en << config->slice_id;
3252 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG5,
3253 					 BIT(config->slice_id), alloc_oneway_en);
3254 		if (ret)
3255 			return ret;
3256 
3257 		ovcap_en = config->ovcap_en << config->slice_id;
3258 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG6,
3259 					 BIT(config->slice_id), ovcap_en);
3260 		if (ret)
3261 			return ret;
3262 
3263 		ovcap_prio = config->ovcap_prio << config->slice_id;
3264 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG7,
3265 					 BIT(config->slice_id), ovcap_prio);
3266 		if (ret)
3267 			return ret;
3268 
3269 		vict_prio = config->vict_prio << config->slice_id;
3270 		ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_ALGO_CFG8,
3271 					 BIT(config->slice_id), vict_prio);
3272 		if (ret)
3273 			return ret;
3274 	}
3275 
3276 	if (config->activate_on_init) {
3277 		desc.slice_id = config->slice_id;
3278 		ret = llcc_slice_activate(&desc);
3279 	}
3280 
3281 	return ret;
3282 }
3283 
qcom_llcc_cfg_program(struct platform_device * pdev,const struct qcom_llcc_config * cfg)3284 static int qcom_llcc_cfg_program(struct platform_device *pdev,
3285 				 const struct qcom_llcc_config *cfg)
3286 {
3287 	int i;
3288 	u32 sz;
3289 	int ret = 0;
3290 	const struct llcc_slice_config *llcc_table;
3291 
3292 	sz = drv_data->cfg_size;
3293 	llcc_table = drv_data->cfg;
3294 
3295 	for (i = 0; i < sz; i++) {
3296 		ret = _qcom_llcc_cfg_program(&llcc_table[i], cfg);
3297 		if (ret)
3298 			return ret;
3299 	}
3300 
3301 	return ret;
3302 }
3303 
qcom_llcc_get_cfg_index(struct platform_device * pdev,u8 * cfg_index,int num_config)3304 static int qcom_llcc_get_cfg_index(struct platform_device *pdev, u8 *cfg_index, int num_config)
3305 {
3306 	int ret;
3307 
3308 	ret = nvmem_cell_read_u8(&pdev->dev, "multi-chan-ddr", cfg_index);
3309 	if (ret == -ENOENT || ret == -EOPNOTSUPP) {
3310 		if (num_config > 1)
3311 			return -EINVAL;
3312 		*cfg_index = 0;
3313 		return 0;
3314 	}
3315 
3316 	if (!ret && *cfg_index >= num_config)
3317 		ret = -EINVAL;
3318 
3319 	return ret;
3320 }
3321 
qcom_llcc_remove(struct platform_device * pdev)3322 static void qcom_llcc_remove(struct platform_device *pdev)
3323 {
3324 	/* Set the global pointer to a error code to avoid referencing it */
3325 	drv_data = ERR_PTR(-ENODEV);
3326 }
3327 
qcom_llcc_init_mmio(struct platform_device * pdev,u8 index,const char * name)3328 static struct regmap *qcom_llcc_init_mmio(struct platform_device *pdev, u8 index,
3329 					  const char *name)
3330 {
3331 	void __iomem *base;
3332 	struct regmap_config llcc_regmap_config = {
3333 		.reg_bits = 32,
3334 		.reg_stride = 4,
3335 		.val_bits = 32,
3336 		.fast_io = true,
3337 	};
3338 
3339 	base = devm_platform_ioremap_resource(pdev, index);
3340 	if (IS_ERR(base))
3341 		return ERR_CAST(base);
3342 
3343 	llcc_regmap_config.name = name;
3344 	return devm_regmap_init_mmio(&pdev->dev, base, &llcc_regmap_config);
3345 }
3346 
qcom_llcc_probe(struct platform_device * pdev)3347 static int qcom_llcc_probe(struct platform_device *pdev)
3348 {
3349 	u32 num_banks;
3350 	struct device *dev = &pdev->dev;
3351 	int ret, i;
3352 	struct platform_device *llcc_edac;
3353 	const struct qcom_sct_config *cfgs;
3354 	const struct qcom_llcc_config *cfg;
3355 	const struct llcc_slice_config *llcc_cfg;
3356 	u32 sz;
3357 	u8 cfg_index;
3358 	u32 version;
3359 	struct regmap *regmap;
3360 
3361 	if (!IS_ERR(drv_data))
3362 		return -EBUSY;
3363 
3364 	drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL);
3365 	if (!drv_data) {
3366 		ret = -ENOMEM;
3367 		goto err;
3368 	}
3369 
3370 	/* Initialize the first LLCC bank regmap */
3371 	regmap = qcom_llcc_init_mmio(pdev, 0, "llcc0_base");
3372 	if (IS_ERR(regmap)) {
3373 		ret = PTR_ERR(regmap);
3374 		goto err;
3375 	}
3376 
3377 	cfgs = of_device_get_match_data(&pdev->dev);
3378 	if (!cfgs) {
3379 		ret = -EINVAL;
3380 		goto err;
3381 	}
3382 	ret = qcom_llcc_get_cfg_index(pdev, &cfg_index, cfgs->num_config);
3383 	if (ret)
3384 		goto err;
3385 	cfg = &cfgs->llcc_config[cfg_index];
3386 
3387 	ret = regmap_read(regmap, cfg->reg_offset[LLCC_COMMON_STATUS0], &num_banks);
3388 	if (ret)
3389 		goto err;
3390 
3391 	num_banks &= LLCC_LB_CNT_MASK;
3392 	num_banks >>= LLCC_LB_CNT_SHIFT;
3393 	drv_data->num_banks = num_banks;
3394 
3395 	drv_data->regmaps = devm_kcalloc(dev, num_banks, sizeof(*drv_data->regmaps), GFP_KERNEL);
3396 	if (!drv_data->regmaps) {
3397 		ret = -ENOMEM;
3398 		goto err;
3399 	}
3400 
3401 	drv_data->regmaps[0] = regmap;
3402 
3403 	/* Initialize rest of LLCC bank regmaps */
3404 	for (i = 1; i < num_banks; i++) {
3405 		char *base __free(kfree) = kasprintf(GFP_KERNEL, "llcc%d_base", i);
3406 
3407 		drv_data->regmaps[i] = qcom_llcc_init_mmio(pdev, i, base);
3408 		if (IS_ERR(drv_data->regmaps[i])) {
3409 			ret = PTR_ERR(drv_data->regmaps[i]);
3410 			goto err;
3411 		}
3412 	}
3413 
3414 	drv_data->bcast_regmap = qcom_llcc_init_mmio(pdev, i, "llcc_broadcast_base");
3415 	if (IS_ERR(drv_data->bcast_regmap)) {
3416 		ret = PTR_ERR(drv_data->bcast_regmap);
3417 		goto err;
3418 	}
3419 
3420 	/* Extract version of the IP */
3421 	ret = regmap_read(drv_data->bcast_regmap, cfg->reg_offset[LLCC_COMMON_HW_INFO],
3422 			  &version);
3423 	if (ret)
3424 		goto err;
3425 
3426 	drv_data->version = version;
3427 
3428 	/* Applicable only when drv_data->version >= 4.1 */
3429 	if (drv_data->version >= LLCC_VERSION_4_1_0_0) {
3430 		drv_data->bcast_and_regmap = qcom_llcc_init_mmio(pdev, i + 1, "llcc_broadcast_and_base");
3431 		if (IS_ERR(drv_data->bcast_and_regmap)) {
3432 			ret = PTR_ERR(drv_data->bcast_and_regmap);
3433 			if (ret == -EINVAL)
3434 				drv_data->bcast_and_regmap = NULL;
3435 			else
3436 				goto err;
3437 		}
3438 	}
3439 
3440 	llcc_cfg = cfg->sct_data;
3441 	sz = cfg->size;
3442 
3443 	for (i = 0; i < sz; i++)
3444 		if (llcc_cfg[i].slice_id > drv_data->max_slices)
3445 			drv_data->max_slices = llcc_cfg[i].slice_id;
3446 
3447 	drv_data->bitmap = devm_bitmap_zalloc(dev, drv_data->max_slices,
3448 					      GFP_KERNEL);
3449 	if (!drv_data->bitmap) {
3450 		ret = -ENOMEM;
3451 		goto err;
3452 	}
3453 
3454 	drv_data->cfg = llcc_cfg;
3455 	drv_data->cfg_size = sz;
3456 	drv_data->edac_reg_offset = cfg->edac_reg_offset;
3457 	drv_data->ecc_irq_configured = cfg->irq_configured;
3458 	mutex_init(&drv_data->lock);
3459 	platform_set_drvdata(pdev, drv_data);
3460 
3461 	ret = qcom_llcc_cfg_program(pdev, cfg);
3462 	if (ret)
3463 		goto err;
3464 
3465 	drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
3466 
3467 	/*
3468 	 * On some platforms, the access to EDAC registers will be locked by
3469 	 * the bootloader. So probing the EDAC driver will result in a crash.
3470 	 * Hence, disable the creation of EDAC platform device for the
3471 	 * problematic platforms.
3472 	 */
3473 	if (!cfg->no_edac) {
3474 		llcc_edac = platform_device_register_data(&pdev->dev,
3475 						"qcom_llcc_edac", -1, drv_data,
3476 						sizeof(*drv_data));
3477 		if (IS_ERR(llcc_edac))
3478 			dev_err(dev, "Failed to register llcc edac driver\n");
3479 	}
3480 
3481 	return 0;
3482 err:
3483 	drv_data = ERR_PTR(-ENODEV);
3484 	return ret;
3485 }
3486 
3487 static const struct of_device_id qcom_llcc_of_match[] = {
3488 	{ .compatible = "qcom,qdu1000-llcc", .data = &qdu1000_cfgs},
3489 	{ .compatible = "qcom,sa8775p-llcc", .data = &sa8775p_cfgs },
3490 	{ .compatible = "qcom,sc7180-llcc", .data = &sc7180_cfgs },
3491 	{ .compatible = "qcom,sc7280-llcc", .data = &sc7280_cfgs },
3492 	{ .compatible = "qcom,sc8180x-llcc", .data = &sc8180x_cfgs },
3493 	{ .compatible = "qcom,sc8280xp-llcc", .data = &sc8280xp_cfgs },
3494 	{ .compatible = "qcom,sdm845-llcc", .data = &sdm845_cfgs },
3495 	{ .compatible = "qcom,sm6350-llcc", .data = &sm6350_cfgs },
3496 	{ .compatible = "qcom,sm7150-llcc", .data = &sm7150_cfgs },
3497 	{ .compatible = "qcom,sm8150-llcc", .data = &sm8150_cfgs },
3498 	{ .compatible = "qcom,sm8250-llcc", .data = &sm8250_cfgs },
3499 	{ .compatible = "qcom,sm8350-llcc", .data = &sm8350_cfgs },
3500 	{ .compatible = "qcom,sm8450-llcc", .data = &sm8450_cfgs },
3501 	{ .compatible = "qcom,sm8550-llcc", .data = &sm8550_cfgs },
3502 	{ .compatible = "qcom,sm8650-llcc", .data = &sm8650_cfgs },
3503 	{ .compatible = "qcom,x1e80100-llcc", .data = &x1e80100_cfgs },
3504 	{ }
3505 };
3506 MODULE_DEVICE_TABLE(of, qcom_llcc_of_match);
3507 
3508 static struct platform_driver qcom_llcc_driver = {
3509 	.driver = {
3510 		.name = "qcom-llcc",
3511 		.of_match_table = qcom_llcc_of_match,
3512 	},
3513 	.probe = qcom_llcc_probe,
3514 	.remove_new = qcom_llcc_remove,
3515 };
3516 module_platform_driver(qcom_llcc_driver);
3517 
3518 MODULE_DESCRIPTION("Qualcomm Last Level Cache Controller");
3519 MODULE_LICENSE("GPL v2");
3520