1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
4  *
5  */
6 
7 #include <linux/platform_device.h>
8 #ifndef __LLCC_QCOM__
9 #define __LLCC_QCOM__
10 
11 #define LLCC_CPUSS       1
12 #define LLCC_VIDSC0      2
13 #define LLCC_VIDSC1      3
14 #define LLCC_ROTATOR     4
15 #define LLCC_VOICE       5
16 #define LLCC_AUDIO       6
17 #define LLCC_MDMHPGRW    7
18 #define LLCC_MDM         8
19 #define LLCC_CMPT        10
20 #define LLCC_GPUHTW      11
21 #define LLCC_GPU         12
22 #define LLCC_MMUHWT      13
23 #define LLCC_CMPTDMA     15
24 #define LLCC_DISP        16
25 #define LLCC_VIDFW       17
26 #define LLCC_MDMHPFX     20
27 #define LLCC_MDMPNG      21
28 #define LLCC_AUDHW       22
29 
30 /**
31  * llcc_slice_desc - Cache slice descriptor
32  * @slice_id: llcc slice id
33  * @slice_size: Size allocated for the llcc slice
34  */
35 struct llcc_slice_desc {
36 	u32 slice_id;
37 	size_t slice_size;
38 };
39 
40 /**
41  * llcc_slice_config - Data associated with the llcc slice
42  * @usecase_id: usecase id for which the llcc slice is used
43  * @slice_id: llcc slice id assigned to each slice
44  * @max_cap: maximum capacity of the llcc slice
45  * @priority: priority of the llcc slice
46  * @fixed_size: whether the llcc slice can grow beyond its size
47  * @bonus_ways: bonus ways associated with llcc slice
48  * @res_ways: reserved ways associated with llcc slice
49  * @cache_mode: mode of the llcc slice
50  * @probe_target_ways: Probe only reserved and bonus ways on a cache miss
51  * @dis_cap_alloc: Disable capacity based allocation
52  * @retain_on_pc: Retain through power collapse
53  * @activate_on_init: activate the slice on init
54  */
55 struct llcc_slice_config {
56 	u32 usecase_id;
57 	u32 slice_id;
58 	u32 max_cap;
59 	u32 priority;
60 	bool fixed_size;
61 	u32 bonus_ways;
62 	u32 res_ways;
63 	u32 cache_mode;
64 	u32 probe_target_ways;
65 	bool dis_cap_alloc;
66 	bool retain_on_pc;
67 	bool activate_on_init;
68 };
69 
70 /**
71  * llcc_drv_data - Data associated with the llcc driver
72  * @regmap: regmap associated with the llcc device
73  * @cfg: pointer to the data structure for slice configuration
74  * @lock: mutex associated with each slice
75  * @cfg_size: size of the config data table
76  * @max_slices: max slices as read from device tree
77  * @bcast_off: Offset of the broadcast bank
78  * @num_banks: Number of llcc banks
79  * @bitmap: Bit map to track the active slice ids
80  * @offsets: Pointer to the bank offsets array
81  */
82 struct llcc_drv_data {
83 	struct regmap *regmap;
84 	const struct llcc_slice_config *cfg;
85 	struct mutex lock;
86 	u32 cfg_size;
87 	u32 max_slices;
88 	u32 bcast_off;
89 	u32 num_banks;
90 	unsigned long *bitmap;
91 	u32 *offsets;
92 };
93 
94 #if IS_ENABLED(CONFIG_QCOM_LLCC)
95 /**
96  * llcc_slice_getd - get llcc slice descriptor
97  * @uid: usecase_id of the client
98  */
99 struct llcc_slice_desc *llcc_slice_getd(u32 uid);
100 
101 /**
102  * llcc_slice_putd - llcc slice descritpor
103  * @desc: Pointer to llcc slice descriptor
104  */
105 void llcc_slice_putd(struct llcc_slice_desc *desc);
106 
107 /**
108  * llcc_get_slice_id - get slice id
109  * @desc: Pointer to llcc slice descriptor
110  */
111 int llcc_get_slice_id(struct llcc_slice_desc *desc);
112 
113 /**
114  * llcc_get_slice_size - llcc slice size
115  * @desc: Pointer to llcc slice descriptor
116  */
117 size_t llcc_get_slice_size(struct llcc_slice_desc *desc);
118 
119 /**
120  * llcc_slice_activate - Activate the llcc slice
121  * @desc: Pointer to llcc slice descriptor
122  */
123 int llcc_slice_activate(struct llcc_slice_desc *desc);
124 
125 /**
126  * llcc_slice_deactivate - Deactivate the llcc slice
127  * @desc: Pointer to llcc slice descriptor
128  */
129 int llcc_slice_deactivate(struct llcc_slice_desc *desc);
130 
131 /**
132  * qcom_llcc_probe - program the sct table
133  * @pdev: platform device pointer
134  * @table: soc sct table
135  * @sz: Size of the config table
136  */
137 int qcom_llcc_probe(struct platform_device *pdev,
138 		      const struct llcc_slice_config *table, u32 sz);
139 #else
llcc_slice_getd(u32 uid)140 static inline struct llcc_slice_desc *llcc_slice_getd(u32 uid)
141 {
142 	return NULL;
143 }
144 
llcc_slice_putd(struct llcc_slice_desc * desc)145 static inline void llcc_slice_putd(struct llcc_slice_desc *desc)
146 {
147 
148 };
149 
llcc_get_slice_id(struct llcc_slice_desc * desc)150 static inline int llcc_get_slice_id(struct llcc_slice_desc *desc)
151 {
152 	return -EINVAL;
153 }
154 
llcc_get_slice_size(struct llcc_slice_desc * desc)155 static inline size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
156 {
157 	return 0;
158 }
llcc_slice_activate(struct llcc_slice_desc * desc)159 static inline int llcc_slice_activate(struct llcc_slice_desc *desc)
160 {
161 	return -EINVAL;
162 }
163 
llcc_slice_deactivate(struct llcc_slice_desc * desc)164 static inline int llcc_slice_deactivate(struct llcc_slice_desc *desc)
165 {
166 	return -EINVAL;
167 }
qcom_llcc_probe(struct platform_device * pdev,const struct llcc_slice_config * table,u32 sz)168 static inline int qcom_llcc_probe(struct platform_device *pdev,
169 		      const struct llcc_slice_config *table, u32 sz)
170 {
171 	return -ENODEV;
172 }
173 
qcom_llcc_remove(struct platform_device * pdev)174 static inline int qcom_llcc_remove(struct platform_device *pdev)
175 {
176 	return -ENODEV;
177 }
178 #endif
179 
180 #endif
181