197fb5e8dSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 225fdd593SJeykumar Sankaran /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 325fdd593SJeykumar Sankaran */ 425fdd593SJeykumar Sankaran 525fdd593SJeykumar Sankaran #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ 625fdd593SJeykumar Sankaran 725fdd593SJeykumar Sankaran #include <linux/debugfs.h> 8feea39a8SSam Ravnborg #include <linux/delay.h> 925fdd593SJeykumar Sankaran 1025fdd593SJeykumar Sankaran #include "dpu_vbif.h" 1125fdd593SJeykumar Sankaran #include "dpu_hw_vbif.h" 1225fdd593SJeykumar Sankaran #include "dpu_trace.h" 1325fdd593SJeykumar Sankaran 1425fdd593SJeykumar Sankaran /** 1525fdd593SJeykumar Sankaran * _dpu_vbif_wait_for_xin_halt - wait for the xin to halt 1625fdd593SJeykumar Sankaran * @vbif: Pointer to hardware vbif driver 1725fdd593SJeykumar Sankaran * @xin_id: Client interface identifier 1825fdd593SJeykumar Sankaran * @return: 0 if success; error code otherwise 1925fdd593SJeykumar Sankaran */ 2025fdd593SJeykumar Sankaran static int _dpu_vbif_wait_for_xin_halt(struct dpu_hw_vbif *vbif, u32 xin_id) 2125fdd593SJeykumar Sankaran { 2225fdd593SJeykumar Sankaran ktime_t timeout; 2325fdd593SJeykumar Sankaran bool status; 2425fdd593SJeykumar Sankaran int rc; 2525fdd593SJeykumar Sankaran 2625fdd593SJeykumar Sankaran if (!vbif || !vbif->cap || !vbif->ops.get_halt_ctrl) { 27a41aa44bSZheng Bin DPU_ERROR("invalid arguments vbif %d\n", vbif != NULL); 2825fdd593SJeykumar Sankaran return -EINVAL; 2925fdd593SJeykumar Sankaran } 3025fdd593SJeykumar Sankaran 3125fdd593SJeykumar Sankaran timeout = ktime_add_us(ktime_get(), vbif->cap->xin_halt_timeout); 3225fdd593SJeykumar Sankaran for (;;) { 3325fdd593SJeykumar Sankaran status = vbif->ops.get_halt_ctrl(vbif, xin_id); 3425fdd593SJeykumar Sankaran if (status) 3525fdd593SJeykumar Sankaran break; 3625fdd593SJeykumar Sankaran if (ktime_compare_safe(ktime_get(), timeout) > 0) { 3725fdd593SJeykumar Sankaran status = vbif->ops.get_halt_ctrl(vbif, xin_id); 3825fdd593SJeykumar Sankaran break; 3925fdd593SJeykumar Sankaran } 4025fdd593SJeykumar Sankaran usleep_range(501, 1000); 4125fdd593SJeykumar Sankaran } 4225fdd593SJeykumar Sankaran 4325fdd593SJeykumar Sankaran if (!status) { 4425fdd593SJeykumar Sankaran rc = -ETIMEDOUT; 4525fdd593SJeykumar Sankaran DPU_ERROR("VBIF %d client %d not halting. TIMEDOUT.\n", 4625fdd593SJeykumar Sankaran vbif->idx - VBIF_0, xin_id); 4725fdd593SJeykumar Sankaran } else { 4825fdd593SJeykumar Sankaran rc = 0; 4925fdd593SJeykumar Sankaran DPU_DEBUG("VBIF %d client %d is halted\n", 5025fdd593SJeykumar Sankaran vbif->idx - VBIF_0, xin_id); 5125fdd593SJeykumar Sankaran } 5225fdd593SJeykumar Sankaran 5325fdd593SJeykumar Sankaran return rc; 5425fdd593SJeykumar Sankaran } 5525fdd593SJeykumar Sankaran 5625fdd593SJeykumar Sankaran /** 5725fdd593SJeykumar Sankaran * _dpu_vbif_apply_dynamic_ot_limit - determine OT based on usecase parameters 5825fdd593SJeykumar Sankaran * @vbif: Pointer to hardware vbif driver 5925fdd593SJeykumar Sankaran * @ot_lim: Pointer to OT limit to be modified 6025fdd593SJeykumar Sankaran * @params: Pointer to usecase parameters 6125fdd593SJeykumar Sankaran */ 6225fdd593SJeykumar Sankaran static void _dpu_vbif_apply_dynamic_ot_limit(struct dpu_hw_vbif *vbif, 6325fdd593SJeykumar Sankaran u32 *ot_lim, struct dpu_vbif_set_ot_params *params) 6425fdd593SJeykumar Sankaran { 6525fdd593SJeykumar Sankaran u64 pps; 6625fdd593SJeykumar Sankaran const struct dpu_vbif_dynamic_ot_tbl *tbl; 6725fdd593SJeykumar Sankaran u32 i; 6825fdd593SJeykumar Sankaran 6925fdd593SJeykumar Sankaran if (!vbif || !(vbif->cap->features & BIT(DPU_VBIF_QOS_OTLIM))) 7025fdd593SJeykumar Sankaran return; 7125fdd593SJeykumar Sankaran 7225fdd593SJeykumar Sankaran /* Dynamic OT setting done only for WFD */ 7325fdd593SJeykumar Sankaran if (!params->is_wfd) 7425fdd593SJeykumar Sankaran return; 7525fdd593SJeykumar Sankaran 7625fdd593SJeykumar Sankaran pps = params->frame_rate; 7725fdd593SJeykumar Sankaran pps *= params->width; 7825fdd593SJeykumar Sankaran pps *= params->height; 7925fdd593SJeykumar Sankaran 8025fdd593SJeykumar Sankaran tbl = params->rd ? &vbif->cap->dynamic_ot_rd_tbl : 8125fdd593SJeykumar Sankaran &vbif->cap->dynamic_ot_wr_tbl; 8225fdd593SJeykumar Sankaran 8325fdd593SJeykumar Sankaran for (i = 0; i < tbl->count; i++) { 8425fdd593SJeykumar Sankaran if (pps <= tbl->cfg[i].pps) { 8525fdd593SJeykumar Sankaran *ot_lim = tbl->cfg[i].ot_limit; 8625fdd593SJeykumar Sankaran break; 8725fdd593SJeykumar Sankaran } 8825fdd593SJeykumar Sankaran } 8925fdd593SJeykumar Sankaran 9025fdd593SJeykumar Sankaran DPU_DEBUG("vbif:%d xin:%d w:%d h:%d fps:%d pps:%llu ot:%u\n", 9125fdd593SJeykumar Sankaran vbif->idx - VBIF_0, params->xin_id, 9225fdd593SJeykumar Sankaran params->width, params->height, params->frame_rate, 9325fdd593SJeykumar Sankaran pps, *ot_lim); 9425fdd593SJeykumar Sankaran } 9525fdd593SJeykumar Sankaran 9625fdd593SJeykumar Sankaran /** 9725fdd593SJeykumar Sankaran * _dpu_vbif_get_ot_limit - get OT based on usecase & configuration parameters 9825fdd593SJeykumar Sankaran * @vbif: Pointer to hardware vbif driver 9925fdd593SJeykumar Sankaran * @params: Pointer to usecase parameters 10025fdd593SJeykumar Sankaran * @return: OT limit 10125fdd593SJeykumar Sankaran */ 10225fdd593SJeykumar Sankaran static u32 _dpu_vbif_get_ot_limit(struct dpu_hw_vbif *vbif, 10325fdd593SJeykumar Sankaran struct dpu_vbif_set_ot_params *params) 10425fdd593SJeykumar Sankaran { 10525fdd593SJeykumar Sankaran u32 ot_lim = 0; 10625fdd593SJeykumar Sankaran u32 val; 10725fdd593SJeykumar Sankaran 10825fdd593SJeykumar Sankaran if (!vbif || !vbif->cap) { 109a41aa44bSZheng Bin DPU_ERROR("invalid arguments vbif %d\n", vbif != NULL); 11025fdd593SJeykumar Sankaran return -EINVAL; 11125fdd593SJeykumar Sankaran } 11225fdd593SJeykumar Sankaran 11325fdd593SJeykumar Sankaran if (vbif->cap->default_ot_wr_limit && !params->rd) 11425fdd593SJeykumar Sankaran ot_lim = vbif->cap->default_ot_wr_limit; 11525fdd593SJeykumar Sankaran else if (vbif->cap->default_ot_rd_limit && params->rd) 11625fdd593SJeykumar Sankaran ot_lim = vbif->cap->default_ot_rd_limit; 11725fdd593SJeykumar Sankaran 11825fdd593SJeykumar Sankaran /* 11925fdd593SJeykumar Sankaran * If default ot is not set from dt/catalog, 12025fdd593SJeykumar Sankaran * then do not configure it. 12125fdd593SJeykumar Sankaran */ 12225fdd593SJeykumar Sankaran if (ot_lim == 0) 12325fdd593SJeykumar Sankaran goto exit; 12425fdd593SJeykumar Sankaran 12525fdd593SJeykumar Sankaran /* Modify the limits if the target and the use case requires it */ 12625fdd593SJeykumar Sankaran _dpu_vbif_apply_dynamic_ot_limit(vbif, &ot_lim, params); 12725fdd593SJeykumar Sankaran 12825fdd593SJeykumar Sankaran if (vbif && vbif->ops.get_limit_conf) { 12925fdd593SJeykumar Sankaran val = vbif->ops.get_limit_conf(vbif, 13025fdd593SJeykumar Sankaran params->xin_id, params->rd); 13125fdd593SJeykumar Sankaran if (val == ot_lim) 13225fdd593SJeykumar Sankaran ot_lim = 0; 13325fdd593SJeykumar Sankaran } 13425fdd593SJeykumar Sankaran 13525fdd593SJeykumar Sankaran exit: 13625fdd593SJeykumar Sankaran DPU_DEBUG("vbif:%d xin:%d ot_lim:%d\n", 13725fdd593SJeykumar Sankaran vbif->idx - VBIF_0, params->xin_id, ot_lim); 13825fdd593SJeykumar Sankaran return ot_lim; 13925fdd593SJeykumar Sankaran } 14025fdd593SJeykumar Sankaran 14125fdd593SJeykumar Sankaran /** 14225fdd593SJeykumar Sankaran * dpu_vbif_set_ot_limit - set OT based on usecase & configuration parameters 14325fdd593SJeykumar Sankaran * @vbif: Pointer to hardware vbif driver 14425fdd593SJeykumar Sankaran * @params: Pointer to usecase parameters 14525fdd593SJeykumar Sankaran * 14625fdd593SJeykumar Sankaran * Note this function would block waiting for bus halt. 14725fdd593SJeykumar Sankaran */ 14825fdd593SJeykumar Sankaran void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms, 14925fdd593SJeykumar Sankaran struct dpu_vbif_set_ot_params *params) 15025fdd593SJeykumar Sankaran { 15125fdd593SJeykumar Sankaran struct dpu_hw_vbif *vbif = NULL; 15225fdd593SJeykumar Sankaran struct dpu_hw_mdp *mdp; 15325fdd593SJeykumar Sankaran bool forced_on = false; 15425fdd593SJeykumar Sankaran u32 ot_lim; 15525fdd593SJeykumar Sankaran int ret, i; 15625fdd593SJeykumar Sankaran 15725fdd593SJeykumar Sankaran mdp = dpu_kms->hw_mdp; 15825fdd593SJeykumar Sankaran 15925fdd593SJeykumar Sankaran for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { 16025fdd593SJeykumar Sankaran if (dpu_kms->hw_vbif[i] && 16125fdd593SJeykumar Sankaran dpu_kms->hw_vbif[i]->idx == params->vbif_idx) 16225fdd593SJeykumar Sankaran vbif = dpu_kms->hw_vbif[i]; 16325fdd593SJeykumar Sankaran } 16425fdd593SJeykumar Sankaran 16525fdd593SJeykumar Sankaran if (!vbif || !mdp) { 16625fdd593SJeykumar Sankaran DPU_DEBUG("invalid arguments vbif %d mdp %d\n", 167a41aa44bSZheng Bin vbif != NULL, mdp != NULL); 16825fdd593SJeykumar Sankaran return; 16925fdd593SJeykumar Sankaran } 17025fdd593SJeykumar Sankaran 17125fdd593SJeykumar Sankaran if (!mdp->ops.setup_clk_force_ctrl || 17225fdd593SJeykumar Sankaran !vbif->ops.set_limit_conf || 17325fdd593SJeykumar Sankaran !vbif->ops.set_halt_ctrl) 17425fdd593SJeykumar Sankaran return; 17525fdd593SJeykumar Sankaran 17625fdd593SJeykumar Sankaran /* set write_gather_en for all write clients */ 17725fdd593SJeykumar Sankaran if (vbif->ops.set_write_gather_en && !params->rd) 17825fdd593SJeykumar Sankaran vbif->ops.set_write_gather_en(vbif, params->xin_id); 17925fdd593SJeykumar Sankaran 18025fdd593SJeykumar Sankaran ot_lim = _dpu_vbif_get_ot_limit(vbif, params) & 0xFF; 18125fdd593SJeykumar Sankaran 18225fdd593SJeykumar Sankaran if (ot_lim == 0) 1830841851fSSean Paul return; 18425fdd593SJeykumar Sankaran 18525fdd593SJeykumar Sankaran trace_dpu_perf_set_ot(params->num, params->xin_id, ot_lim, 18625fdd593SJeykumar Sankaran params->vbif_idx); 18725fdd593SJeykumar Sankaran 18825fdd593SJeykumar Sankaran forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true); 18925fdd593SJeykumar Sankaran 19025fdd593SJeykumar Sankaran vbif->ops.set_limit_conf(vbif, params->xin_id, params->rd, ot_lim); 19125fdd593SJeykumar Sankaran 19225fdd593SJeykumar Sankaran vbif->ops.set_halt_ctrl(vbif, params->xin_id, true); 19325fdd593SJeykumar Sankaran 19425fdd593SJeykumar Sankaran ret = _dpu_vbif_wait_for_xin_halt(vbif, params->xin_id); 19525fdd593SJeykumar Sankaran if (ret) 19625fdd593SJeykumar Sankaran trace_dpu_vbif_wait_xin_halt_fail(vbif->idx, params->xin_id); 19725fdd593SJeykumar Sankaran 19825fdd593SJeykumar Sankaran vbif->ops.set_halt_ctrl(vbif, params->xin_id, false); 19925fdd593SJeykumar Sankaran 20025fdd593SJeykumar Sankaran if (forced_on) 20125fdd593SJeykumar Sankaran mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false); 20225fdd593SJeykumar Sankaran } 20325fdd593SJeykumar Sankaran 20425fdd593SJeykumar Sankaran void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, 20525fdd593SJeykumar Sankaran struct dpu_vbif_set_qos_params *params) 20625fdd593SJeykumar Sankaran { 20725fdd593SJeykumar Sankaran struct dpu_hw_vbif *vbif = NULL; 20825fdd593SJeykumar Sankaran struct dpu_hw_mdp *mdp; 20925fdd593SJeykumar Sankaran bool forced_on = false; 21025fdd593SJeykumar Sankaran const struct dpu_vbif_qos_tbl *qos_tbl; 21125fdd593SJeykumar Sankaran int i; 21225fdd593SJeykumar Sankaran 21396630140SDrew Davenport if (!params || !dpu_kms->hw_mdp) { 21425fdd593SJeykumar Sankaran DPU_ERROR("invalid arguments\n"); 21525fdd593SJeykumar Sankaran return; 21625fdd593SJeykumar Sankaran } 21725fdd593SJeykumar Sankaran mdp = dpu_kms->hw_mdp; 21825fdd593SJeykumar Sankaran 21925fdd593SJeykumar Sankaran for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { 22025fdd593SJeykumar Sankaran if (dpu_kms->hw_vbif[i] && 22125fdd593SJeykumar Sankaran dpu_kms->hw_vbif[i]->idx == params->vbif_idx) { 22225fdd593SJeykumar Sankaran vbif = dpu_kms->hw_vbif[i]; 22325fdd593SJeykumar Sankaran break; 22425fdd593SJeykumar Sankaran } 22525fdd593SJeykumar Sankaran } 22625fdd593SJeykumar Sankaran 22725fdd593SJeykumar Sankaran if (!vbif || !vbif->cap) { 22825fdd593SJeykumar Sankaran DPU_ERROR("invalid vbif %d\n", params->vbif_idx); 22925fdd593SJeykumar Sankaran return; 23025fdd593SJeykumar Sankaran } 23125fdd593SJeykumar Sankaran 23225fdd593SJeykumar Sankaran if (!vbif->ops.set_qos_remap || !mdp->ops.setup_clk_force_ctrl) { 23325fdd593SJeykumar Sankaran DPU_DEBUG("qos remap not supported\n"); 23425fdd593SJeykumar Sankaran return; 23525fdd593SJeykumar Sankaran } 23625fdd593SJeykumar Sankaran 23725fdd593SJeykumar Sankaran qos_tbl = params->is_rt ? &vbif->cap->qos_rt_tbl : 23825fdd593SJeykumar Sankaran &vbif->cap->qos_nrt_tbl; 23925fdd593SJeykumar Sankaran 24025fdd593SJeykumar Sankaran if (!qos_tbl->npriority_lvl || !qos_tbl->priority_lvl) { 24125fdd593SJeykumar Sankaran DPU_DEBUG("qos tbl not defined\n"); 24225fdd593SJeykumar Sankaran return; 24325fdd593SJeykumar Sankaran } 24425fdd593SJeykumar Sankaran 24525fdd593SJeykumar Sankaran forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true); 24625fdd593SJeykumar Sankaran 24725fdd593SJeykumar Sankaran for (i = 0; i < qos_tbl->npriority_lvl; i++) { 24825fdd593SJeykumar Sankaran DPU_DEBUG("vbif:%d xin:%d lvl:%d/%d\n", 24925fdd593SJeykumar Sankaran params->vbif_idx, params->xin_id, i, 25025fdd593SJeykumar Sankaran qos_tbl->priority_lvl[i]); 25125fdd593SJeykumar Sankaran vbif->ops.set_qos_remap(vbif, params->xin_id, i, 25225fdd593SJeykumar Sankaran qos_tbl->priority_lvl[i]); 25325fdd593SJeykumar Sankaran } 25425fdd593SJeykumar Sankaran 25525fdd593SJeykumar Sankaran if (forced_on) 25625fdd593SJeykumar Sankaran mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false); 25725fdd593SJeykumar Sankaran } 25825fdd593SJeykumar Sankaran 25925fdd593SJeykumar Sankaran void dpu_vbif_clear_errors(struct dpu_kms *dpu_kms) 26025fdd593SJeykumar Sankaran { 26125fdd593SJeykumar Sankaran struct dpu_hw_vbif *vbif; 26225fdd593SJeykumar Sankaran u32 i, pnd, src; 26325fdd593SJeykumar Sankaran 26425fdd593SJeykumar Sankaran for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { 26525fdd593SJeykumar Sankaran vbif = dpu_kms->hw_vbif[i]; 26625fdd593SJeykumar Sankaran if (vbif && vbif->ops.clear_errors) { 26725fdd593SJeykumar Sankaran vbif->ops.clear_errors(vbif, &pnd, &src); 26825fdd593SJeykumar Sankaran if (pnd || src) { 26925fdd593SJeykumar Sankaran DRM_DEBUG_KMS("VBIF %d: pnd 0x%X, src 0x%X\n", 27025fdd593SJeykumar Sankaran vbif->idx - VBIF_0, pnd, src); 27125fdd593SJeykumar Sankaran } 27225fdd593SJeykumar Sankaran } 27325fdd593SJeykumar Sankaran } 27425fdd593SJeykumar Sankaran } 27525fdd593SJeykumar Sankaran 27625fdd593SJeykumar Sankaran void dpu_vbif_init_memtypes(struct dpu_kms *dpu_kms) 27725fdd593SJeykumar Sankaran { 27825fdd593SJeykumar Sankaran struct dpu_hw_vbif *vbif; 27925fdd593SJeykumar Sankaran int i, j; 28025fdd593SJeykumar Sankaran 28125fdd593SJeykumar Sankaran for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) { 28225fdd593SJeykumar Sankaran vbif = dpu_kms->hw_vbif[i]; 28325fdd593SJeykumar Sankaran if (vbif && vbif->cap && vbif->ops.set_mem_type) { 28425fdd593SJeykumar Sankaran for (j = 0; j < vbif->cap->memtype_count; j++) 28525fdd593SJeykumar Sankaran vbif->ops.set_mem_type( 28625fdd593SJeykumar Sankaran vbif, j, vbif->cap->memtype[j]); 28725fdd593SJeykumar Sankaran } 28825fdd593SJeykumar Sankaran } 28925fdd593SJeykumar Sankaran } 29025fdd593SJeykumar Sankaran 29125fdd593SJeykumar Sankaran #ifdef CONFIG_DEBUG_FS 29225fdd593SJeykumar Sankaran 2933d688410SJordan Crouse void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) 29425fdd593SJeykumar Sankaran { 29525fdd593SJeykumar Sankaran char vbif_name[32]; 2963d688410SJordan Crouse struct dentry *entry, *debugfs_vbif; 29725fdd593SJeykumar Sankaran int i, j; 29825fdd593SJeykumar Sankaran 2993d688410SJordan Crouse entry = debugfs_create_dir("vbif", debugfs_root); 30025fdd593SJeykumar Sankaran 30125fdd593SJeykumar Sankaran for (i = 0; i < dpu_kms->catalog->vbif_count; i++) { 302abda0d92SStephen Boyd const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i]; 30325fdd593SJeykumar Sankaran 30425fdd593SJeykumar Sankaran snprintf(vbif_name, sizeof(vbif_name), "%d", vbif->id); 30525fdd593SJeykumar Sankaran 3063d688410SJordan Crouse debugfs_vbif = debugfs_create_dir(vbif_name, entry); 30725fdd593SJeykumar Sankaran 30825fdd593SJeykumar Sankaran debugfs_create_u32("features", 0600, debugfs_vbif, 30925fdd593SJeykumar Sankaran (u32 *)&vbif->features); 31025fdd593SJeykumar Sankaran 31125fdd593SJeykumar Sankaran debugfs_create_u32("xin_halt_timeout", 0400, debugfs_vbif, 31225fdd593SJeykumar Sankaran (u32 *)&vbif->xin_halt_timeout); 31325fdd593SJeykumar Sankaran 31425fdd593SJeykumar Sankaran debugfs_create_u32("default_rd_ot_limit", 0400, debugfs_vbif, 31525fdd593SJeykumar Sankaran (u32 *)&vbif->default_ot_rd_limit); 31625fdd593SJeykumar Sankaran 31725fdd593SJeykumar Sankaran debugfs_create_u32("default_wr_ot_limit", 0400, debugfs_vbif, 31825fdd593SJeykumar Sankaran (u32 *)&vbif->default_ot_wr_limit); 31925fdd593SJeykumar Sankaran 32025fdd593SJeykumar Sankaran for (j = 0; j < vbif->dynamic_ot_rd_tbl.count; j++) { 321abda0d92SStephen Boyd const struct dpu_vbif_dynamic_ot_cfg *cfg = 32225fdd593SJeykumar Sankaran &vbif->dynamic_ot_rd_tbl.cfg[j]; 32325fdd593SJeykumar Sankaran 32425fdd593SJeykumar Sankaran snprintf(vbif_name, sizeof(vbif_name), 32525fdd593SJeykumar Sankaran "dynamic_ot_rd_%d_pps", j); 32625fdd593SJeykumar Sankaran debugfs_create_u64(vbif_name, 0400, debugfs_vbif, 32725fdd593SJeykumar Sankaran (u64 *)&cfg->pps); 32825fdd593SJeykumar Sankaran snprintf(vbif_name, sizeof(vbif_name), 32925fdd593SJeykumar Sankaran "dynamic_ot_rd_%d_ot_limit", j); 33025fdd593SJeykumar Sankaran debugfs_create_u32(vbif_name, 0400, debugfs_vbif, 33125fdd593SJeykumar Sankaran (u32 *)&cfg->ot_limit); 33225fdd593SJeykumar Sankaran } 33325fdd593SJeykumar Sankaran 33425fdd593SJeykumar Sankaran for (j = 0; j < vbif->dynamic_ot_wr_tbl.count; j++) { 335abda0d92SStephen Boyd const struct dpu_vbif_dynamic_ot_cfg *cfg = 33625fdd593SJeykumar Sankaran &vbif->dynamic_ot_wr_tbl.cfg[j]; 33725fdd593SJeykumar Sankaran 33825fdd593SJeykumar Sankaran snprintf(vbif_name, sizeof(vbif_name), 33925fdd593SJeykumar Sankaran "dynamic_ot_wr_%d_pps", j); 34025fdd593SJeykumar Sankaran debugfs_create_u64(vbif_name, 0400, debugfs_vbif, 34125fdd593SJeykumar Sankaran (u64 *)&cfg->pps); 34225fdd593SJeykumar Sankaran snprintf(vbif_name, sizeof(vbif_name), 34325fdd593SJeykumar Sankaran "dynamic_ot_wr_%d_ot_limit", j); 34425fdd593SJeykumar Sankaran debugfs_create_u32(vbif_name, 0400, debugfs_vbif, 34525fdd593SJeykumar Sankaran (u32 *)&cfg->ot_limit); 34625fdd593SJeykumar Sankaran } 34725fdd593SJeykumar Sankaran } 34825fdd593SJeykumar Sankaran } 34925fdd593SJeykumar Sankaran #endif 350