.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. |
---|
2 | | - * |
---|
3 | | - * This program is free software; you can redistribute it and/or modify |
---|
4 | | - * it under the terms of the GNU General Public License version 2 and |
---|
5 | | - * only version 2 as published by the Free Software Foundation. |
---|
6 | | - * |
---|
7 | | - * This program is distributed in the hope that it will be useful, |
---|
8 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
9 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
10 | | - * GNU General Public License for more details. |
---|
11 | 3 | */ |
---|
12 | 4 | |
---|
13 | 5 | #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ |
---|
14 | 6 | |
---|
15 | 7 | #include <linux/debugfs.h> |
---|
| 8 | +#include <linux/delay.h> |
---|
16 | 9 | |
---|
17 | 10 | #include "dpu_vbif.h" |
---|
18 | 11 | #include "dpu_hw_vbif.h" |
---|
19 | 12 | #include "dpu_trace.h" |
---|
| 13 | + |
---|
| 14 | +static struct dpu_hw_vbif *dpu_get_vbif(struct dpu_kms *dpu_kms, enum dpu_vbif vbif_idx) |
---|
| 15 | +{ |
---|
| 16 | + if (vbif_idx < ARRAY_SIZE(dpu_kms->hw_vbif)) |
---|
| 17 | + return dpu_kms->hw_vbif[vbif_idx]; |
---|
| 18 | + |
---|
| 19 | + return NULL; |
---|
| 20 | +} |
---|
20 | 21 | |
---|
21 | 22 | /** |
---|
22 | 23 | * _dpu_vbif_wait_for_xin_halt - wait for the xin to halt |
---|
.. | .. |
---|
31 | 32 | int rc; |
---|
32 | 33 | |
---|
33 | 34 | if (!vbif || !vbif->cap || !vbif->ops.get_halt_ctrl) { |
---|
34 | | - DPU_ERROR("invalid arguments vbif %d\n", vbif != 0); |
---|
| 35 | + DPU_ERROR("invalid arguments vbif %d\n", vbif != NULL); |
---|
35 | 36 | return -EINVAL; |
---|
36 | 37 | } |
---|
37 | 38 | |
---|
.. | .. |
---|
113 | 114 | u32 val; |
---|
114 | 115 | |
---|
115 | 116 | if (!vbif || !vbif->cap) { |
---|
116 | | - DPU_ERROR("invalid arguments vbif %d\n", vbif != 0); |
---|
| 117 | + DPU_ERROR("invalid arguments vbif %d\n", vbif != NULL); |
---|
117 | 118 | return -EINVAL; |
---|
118 | 119 | } |
---|
119 | 120 | |
---|
.. | .. |
---|
155 | 156 | void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms, |
---|
156 | 157 | struct dpu_vbif_set_ot_params *params) |
---|
157 | 158 | { |
---|
158 | | - struct dpu_hw_vbif *vbif = NULL; |
---|
| 159 | + struct dpu_hw_vbif *vbif; |
---|
159 | 160 | struct dpu_hw_mdp *mdp; |
---|
160 | 161 | bool forced_on = false; |
---|
161 | 162 | u32 ot_lim; |
---|
162 | | - int ret, i; |
---|
| 163 | + int ret; |
---|
163 | 164 | |
---|
164 | | - if (!dpu_kms) { |
---|
165 | | - DPU_ERROR("invalid arguments\n"); |
---|
166 | | - return; |
---|
167 | | - } |
---|
168 | 165 | mdp = dpu_kms->hw_mdp; |
---|
169 | 166 | |
---|
170 | | - for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { |
---|
171 | | - if (dpu_kms->hw_vbif[i] && |
---|
172 | | - dpu_kms->hw_vbif[i]->idx == params->vbif_idx) |
---|
173 | | - vbif = dpu_kms->hw_vbif[i]; |
---|
174 | | - } |
---|
175 | | - |
---|
| 167 | + vbif = dpu_get_vbif(dpu_kms, params->vbif_idx); |
---|
176 | 168 | if (!vbif || !mdp) { |
---|
177 | 169 | DPU_DEBUG("invalid arguments vbif %d mdp %d\n", |
---|
178 | | - vbif != 0, mdp != 0); |
---|
| 170 | + vbif != NULL, mdp != NULL); |
---|
179 | 171 | return; |
---|
180 | 172 | } |
---|
181 | 173 | |
---|
.. | .. |
---|
191 | 183 | ot_lim = _dpu_vbif_get_ot_limit(vbif, params) & 0xFF; |
---|
192 | 184 | |
---|
193 | 185 | if (ot_lim == 0) |
---|
194 | | - goto exit; |
---|
| 186 | + return; |
---|
195 | 187 | |
---|
196 | 188 | trace_dpu_perf_set_ot(params->num, params->xin_id, ot_lim, |
---|
197 | 189 | params->vbif_idx); |
---|
.. | .. |
---|
210 | 202 | |
---|
211 | 203 | if (forced_on) |
---|
212 | 204 | mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false); |
---|
213 | | -exit: |
---|
214 | | - return; |
---|
215 | 205 | } |
---|
216 | 206 | |
---|
217 | 207 | void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, |
---|
218 | 208 | struct dpu_vbif_set_qos_params *params) |
---|
219 | 209 | { |
---|
220 | | - struct dpu_hw_vbif *vbif = NULL; |
---|
| 210 | + struct dpu_hw_vbif *vbif; |
---|
221 | 211 | struct dpu_hw_mdp *mdp; |
---|
222 | 212 | bool forced_on = false; |
---|
223 | 213 | const struct dpu_vbif_qos_tbl *qos_tbl; |
---|
224 | 214 | int i; |
---|
225 | 215 | |
---|
226 | | - if (!dpu_kms || !params || !dpu_kms->hw_mdp) { |
---|
| 216 | + if (!params || !dpu_kms->hw_mdp) { |
---|
227 | 217 | DPU_ERROR("invalid arguments\n"); |
---|
228 | 218 | return; |
---|
229 | 219 | } |
---|
230 | 220 | mdp = dpu_kms->hw_mdp; |
---|
231 | 221 | |
---|
232 | | - for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { |
---|
233 | | - if (dpu_kms->hw_vbif[i] && |
---|
234 | | - dpu_kms->hw_vbif[i]->idx == params->vbif_idx) { |
---|
235 | | - vbif = dpu_kms->hw_vbif[i]; |
---|
236 | | - break; |
---|
237 | | - } |
---|
238 | | - } |
---|
| 222 | + vbif = dpu_get_vbif(dpu_kms, params->vbif_idx); |
---|
239 | 223 | |
---|
240 | 224 | if (!vbif || !vbif->cap) { |
---|
241 | 225 | DPU_ERROR("invalid vbif %d\n", params->vbif_idx); |
---|
.. | .. |
---|
274 | 258 | struct dpu_hw_vbif *vbif; |
---|
275 | 259 | u32 i, pnd, src; |
---|
276 | 260 | |
---|
277 | | - if (!dpu_kms) { |
---|
278 | | - DPU_ERROR("invalid argument\n"); |
---|
279 | | - return; |
---|
280 | | - } |
---|
281 | | - |
---|
282 | 261 | for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { |
---|
283 | 262 | vbif = dpu_kms->hw_vbif[i]; |
---|
284 | 263 | if (vbif && vbif->ops.clear_errors) { |
---|
.. | .. |
---|
296 | 275 | struct dpu_hw_vbif *vbif; |
---|
297 | 276 | int i, j; |
---|
298 | 277 | |
---|
299 | | - if (!dpu_kms) { |
---|
300 | | - DPU_ERROR("invalid argument\n"); |
---|
301 | | - return; |
---|
302 | | - } |
---|
303 | | - |
---|
304 | 278 | for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { |
---|
305 | 279 | vbif = dpu_kms->hw_vbif[i]; |
---|
306 | 280 | if (vbif && vbif->cap && vbif->ops.set_mem_type) { |
---|
.. | .. |
---|
312 | 286 | } |
---|
313 | 287 | |
---|
314 | 288 | #ifdef CONFIG_DEBUG_FS |
---|
315 | | -void dpu_debugfs_vbif_destroy(struct dpu_kms *dpu_kms) |
---|
316 | | -{ |
---|
317 | | - debugfs_remove_recursive(dpu_kms->debugfs_vbif); |
---|
318 | | - dpu_kms->debugfs_vbif = NULL; |
---|
319 | | -} |
---|
320 | 289 | |
---|
321 | | -int dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) |
---|
| 290 | +void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) |
---|
322 | 291 | { |
---|
323 | 292 | char vbif_name[32]; |
---|
324 | | - struct dentry *debugfs_vbif; |
---|
| 293 | + struct dentry *entry, *debugfs_vbif; |
---|
325 | 294 | int i, j; |
---|
326 | 295 | |
---|
327 | | - dpu_kms->debugfs_vbif = debugfs_create_dir("vbif", debugfs_root); |
---|
328 | | - if (!dpu_kms->debugfs_vbif) { |
---|
329 | | - DPU_ERROR("failed to create vbif debugfs\n"); |
---|
330 | | - return -EINVAL; |
---|
331 | | - } |
---|
| 296 | + entry = debugfs_create_dir("vbif", debugfs_root); |
---|
332 | 297 | |
---|
333 | 298 | for (i = 0; i < dpu_kms->catalog->vbif_count; i++) { |
---|
334 | | - struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i]; |
---|
| 299 | + const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i]; |
---|
335 | 300 | |
---|
336 | 301 | snprintf(vbif_name, sizeof(vbif_name), "%d", vbif->id); |
---|
337 | 302 | |
---|
338 | | - debugfs_vbif = debugfs_create_dir(vbif_name, |
---|
339 | | - dpu_kms->debugfs_vbif); |
---|
| 303 | + debugfs_vbif = debugfs_create_dir(vbif_name, entry); |
---|
340 | 304 | |
---|
341 | 305 | debugfs_create_u32("features", 0600, debugfs_vbif, |
---|
342 | 306 | (u32 *)&vbif->features); |
---|
.. | .. |
---|
351 | 315 | (u32 *)&vbif->default_ot_wr_limit); |
---|
352 | 316 | |
---|
353 | 317 | for (j = 0; j < vbif->dynamic_ot_rd_tbl.count; j++) { |
---|
354 | | - struct dpu_vbif_dynamic_ot_cfg *cfg = |
---|
| 318 | + const struct dpu_vbif_dynamic_ot_cfg *cfg = |
---|
355 | 319 | &vbif->dynamic_ot_rd_tbl.cfg[j]; |
---|
356 | 320 | |
---|
357 | 321 | snprintf(vbif_name, sizeof(vbif_name), |
---|
.. | .. |
---|
365 | 329 | } |
---|
366 | 330 | |
---|
367 | 331 | for (j = 0; j < vbif->dynamic_ot_wr_tbl.count; j++) { |
---|
368 | | - struct dpu_vbif_dynamic_ot_cfg *cfg = |
---|
| 332 | + const struct dpu_vbif_dynamic_ot_cfg *cfg = |
---|
369 | 333 | &vbif->dynamic_ot_wr_tbl.cfg[j]; |
---|
370 | 334 | |
---|
371 | 335 | snprintf(vbif_name, sizeof(vbif_name), |
---|
.. | .. |
---|
378 | 342 | (u32 *)&cfg->ot_limit); |
---|
379 | 343 | } |
---|
380 | 344 | } |
---|
381 | | - |
---|
382 | | - return 0; |
---|
383 | 345 | } |
---|
384 | 346 | #endif |
---|