GNU Linux-libre 4.19.264-gnu1
[releases.git] / include / linux / soc / qcom / llcc-qcom.h
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
140 static inline struct llcc_slice_desc *llcc_slice_getd(u32 uid)
141 {
142         return NULL;
143 }
144
145 static inline void llcc_slice_putd(struct llcc_slice_desc *desc)
146 {
147
148 };
149
150 static inline int llcc_get_slice_id(struct llcc_slice_desc *desc)
151 {
152         return -EINVAL;
153 }
154
155 static inline size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
156 {
157         return 0;
158 }
159 static inline int llcc_slice_activate(struct llcc_slice_desc *desc)
160 {
161         return -EINVAL;
162 }
163
164 static inline int llcc_slice_deactivate(struct llcc_slice_desc *desc)
165 {
166         return -EINVAL;
167 }
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
174 static inline int qcom_llcc_remove(struct platform_device *pdev)
175 {
176         return -ENODEV;
177 }
178 #endif
179
180 #endif