Loading drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c +33 −18 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #define MAX_STR_CL 50 #define MSM_BUS_MAS_ALC 144 #define MSM_BUS_RSC_APPS 8000 struct bus_search_type { struct list_head link; Loading @@ -40,6 +41,7 @@ static struct handle_type handle_list; static LIST_HEAD(input_list); static LIST_HEAD(apply_list); static LIST_HEAD(commit_list); static LIST_HEAD(late_init_clist); static LIST_HEAD(query_list); DEFINE_RT_MUTEX(msm_bus_adhoc_lock); Loading Loading @@ -652,32 +654,33 @@ static void bcm_update_alc_req(struct msm_bus_node_device_type *dev, int ctx) int bcm_remove_handoff_req(struct device *dev, void *data) { struct msm_bus_node_device_type *bcm_dev = NULL; int i; uint64_t max_ib = 0; uint64_t max_ab = 0; struct msm_bus_node_device_type *bus_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; struct msm_bus_node_device_type *cur_rsc = NULL; int ret = 0; rt_mutex_lock(&msm_bus_adhoc_lock); bcm_dev = to_msm_bus_node(dev); if (!bcm_dev) { MSM_BUS_ERR("%s: Null device ptr", __func__); bus_dev = to_msm_bus_node(dev); if (bus_dev->node_info->is_bcm_dev || bus_dev->node_info->is_fab_dev || bus_dev->node_info->is_rsc_dev) goto exit_bcm_remove_handoff_req; } if (!bcm_dev->node_info->is_bcm_dev) if (bus_dev->node_info->num_bcm_devs) { cur_bcm = to_msm_bus_node(bus_dev->node_info->bcm_devs[0]); if (cur_bcm->node_info->num_rsc_devs) { cur_rsc = to_msm_bus_node(cur_bcm->node_info->rsc_devs[0]); if (cur_rsc->node_info->id != MSM_BUS_RSC_APPS) goto exit_bcm_remove_handoff_req; for (i = 0; i < bcm_dev->num_lnodes; i++) { max_ib = max(max_ib, bcm_dev->lnode_list[i].lnode_ib[0]); max_ab = max(max_ab, bcm_dev->lnode_list[i].lnode_ab[0]); } } bcm_dev->node_bw[0].max_ab = max_ab; bcm_dev->node_bw[0].max_ib = max_ib; if (!bus_dev->dirty) { list_add_tail(&bus_dev->link, &late_init_clist); bus_dev->dirty = true; } exit_bcm_remove_handoff_req: rt_mutex_unlock(&msm_bus_adhoc_lock); Loading Loading @@ -807,6 +810,18 @@ static void commit_data(void) INIT_LIST_HEAD(&commit_list); } void commit_late_init_data(void) { rt_mutex_lock(&msm_bus_adhoc_lock); msm_bus_commit_data(&late_init_clist); INIT_LIST_HEAD(&late_init_clist); rt_mutex_unlock(&msm_bus_adhoc_lock); } static void add_node_to_clist(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *node_parent = Loading drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c +16 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data); static struct list_head bcm_query_list_inorder[VCD_MAX_CNT]; static struct msm_bus_node_device_type *cur_rsc; static bool init_time = true; struct bcm_db { uint32_t unit_size; Loading Loading @@ -484,7 +485,8 @@ static int bcm_clist_clean(struct msm_bus_node_device_type *cur_dev) if (cur_bcm->node_vec[DUAL_CTX].vec_a == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_a == 0 && cur_bcm->node_vec[DUAL_CTX].vec_b == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0) { cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0 && init_time == false) { cur_bcm->dirty = false; list_del_init(&cur_bcm->link); } Loading Loading @@ -553,7 +555,13 @@ int msm_bus_commit_data(struct list_head *clist) cnt_sleep++; cnt_wake++; } if (!cur_bcm->updated) if (cur_bcm->updated || (cur_bcm->node_vec[DUAL_CTX].vec_a == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_a == 0 && cur_bcm->node_vec[DUAL_CTX].vec_b == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0 && init_time == true)) continue; cnt_active++; } cnt_vcd++; Loading @@ -563,6 +571,7 @@ int msm_bus_commit_data(struct list_head *clist) n_wake = kcalloc(cnt_vcd+1, sizeof(int), GFP_KERNEL); n_sleep = kcalloc(cnt_vcd+1, sizeof(int), GFP_KERNEL); if (cnt_active) cmdlist_active = kcalloc(cnt_active, sizeof(struct tcs_cmd), GFP_KERNEL); if (cnt_sleep && cnt_wake) { Loading Loading @@ -1285,6 +1294,7 @@ static struct device *msm_bus_device_init( bus_node->node_info = node_info; bus_node->ap_owned = pdata->ap_owned; bus_node->dirty = false; bus_dev->of_node = pdata->of_node; if (msm_bus_copy_node_info(pdata, bus_dev) < 0) { Loading Loading @@ -1649,9 +1659,11 @@ int __init msm_bus_device_late_init(void) int rc; MSM_BUS_ERR("msm_bus_late_init: Remove handoff bw requests\n"); init_time = false; rc = bus_for_each_dev(&msm_bus_type, NULL, NULL, bcm_remove_handoff_req); commit_late_init_data(); return rc; } subsys_initcall(msm_bus_device_init_driver); Loading drivers/soc/qcom/msm_bus/msm_bus_rpmh.h +1 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ int msm_bus_enable_limiter(struct msm_bus_node_device_type *nodedev, int throttle_en, uint64_t lim_bw); int msm_bus_commit_data(struct list_head *clist); int bcm_remove_handoff_req(struct device *dev, void *data); void commit_late_init_data(void); int msm_bus_query_gen(struct list_head *qlist, struct msm_bus_tcs_usecase *tcs_usecase); void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size, Loading Loading
drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c +33 −18 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #define MAX_STR_CL 50 #define MSM_BUS_MAS_ALC 144 #define MSM_BUS_RSC_APPS 8000 struct bus_search_type { struct list_head link; Loading @@ -40,6 +41,7 @@ static struct handle_type handle_list; static LIST_HEAD(input_list); static LIST_HEAD(apply_list); static LIST_HEAD(commit_list); static LIST_HEAD(late_init_clist); static LIST_HEAD(query_list); DEFINE_RT_MUTEX(msm_bus_adhoc_lock); Loading Loading @@ -652,32 +654,33 @@ static void bcm_update_alc_req(struct msm_bus_node_device_type *dev, int ctx) int bcm_remove_handoff_req(struct device *dev, void *data) { struct msm_bus_node_device_type *bcm_dev = NULL; int i; uint64_t max_ib = 0; uint64_t max_ab = 0; struct msm_bus_node_device_type *bus_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; struct msm_bus_node_device_type *cur_rsc = NULL; int ret = 0; rt_mutex_lock(&msm_bus_adhoc_lock); bcm_dev = to_msm_bus_node(dev); if (!bcm_dev) { MSM_BUS_ERR("%s: Null device ptr", __func__); bus_dev = to_msm_bus_node(dev); if (bus_dev->node_info->is_bcm_dev || bus_dev->node_info->is_fab_dev || bus_dev->node_info->is_rsc_dev) goto exit_bcm_remove_handoff_req; } if (!bcm_dev->node_info->is_bcm_dev) if (bus_dev->node_info->num_bcm_devs) { cur_bcm = to_msm_bus_node(bus_dev->node_info->bcm_devs[0]); if (cur_bcm->node_info->num_rsc_devs) { cur_rsc = to_msm_bus_node(cur_bcm->node_info->rsc_devs[0]); if (cur_rsc->node_info->id != MSM_BUS_RSC_APPS) goto exit_bcm_remove_handoff_req; for (i = 0; i < bcm_dev->num_lnodes; i++) { max_ib = max(max_ib, bcm_dev->lnode_list[i].lnode_ib[0]); max_ab = max(max_ab, bcm_dev->lnode_list[i].lnode_ab[0]); } } bcm_dev->node_bw[0].max_ab = max_ab; bcm_dev->node_bw[0].max_ib = max_ib; if (!bus_dev->dirty) { list_add_tail(&bus_dev->link, &late_init_clist); bus_dev->dirty = true; } exit_bcm_remove_handoff_req: rt_mutex_unlock(&msm_bus_adhoc_lock); Loading Loading @@ -807,6 +810,18 @@ static void commit_data(void) INIT_LIST_HEAD(&commit_list); } void commit_late_init_data(void) { rt_mutex_lock(&msm_bus_adhoc_lock); msm_bus_commit_data(&late_init_clist); INIT_LIST_HEAD(&late_init_clist); rt_mutex_unlock(&msm_bus_adhoc_lock); } static void add_node_to_clist(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *node_parent = Loading
drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c +16 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data); static struct list_head bcm_query_list_inorder[VCD_MAX_CNT]; static struct msm_bus_node_device_type *cur_rsc; static bool init_time = true; struct bcm_db { uint32_t unit_size; Loading Loading @@ -484,7 +485,8 @@ static int bcm_clist_clean(struct msm_bus_node_device_type *cur_dev) if (cur_bcm->node_vec[DUAL_CTX].vec_a == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_a == 0 && cur_bcm->node_vec[DUAL_CTX].vec_b == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0) { cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0 && init_time == false) { cur_bcm->dirty = false; list_del_init(&cur_bcm->link); } Loading Loading @@ -553,7 +555,13 @@ int msm_bus_commit_data(struct list_head *clist) cnt_sleep++; cnt_wake++; } if (!cur_bcm->updated) if (cur_bcm->updated || (cur_bcm->node_vec[DUAL_CTX].vec_a == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_a == 0 && cur_bcm->node_vec[DUAL_CTX].vec_b == 0 && cur_bcm->node_vec[ACTIVE_CTX].vec_b == 0 && init_time == true)) continue; cnt_active++; } cnt_vcd++; Loading @@ -563,6 +571,7 @@ int msm_bus_commit_data(struct list_head *clist) n_wake = kcalloc(cnt_vcd+1, sizeof(int), GFP_KERNEL); n_sleep = kcalloc(cnt_vcd+1, sizeof(int), GFP_KERNEL); if (cnt_active) cmdlist_active = kcalloc(cnt_active, sizeof(struct tcs_cmd), GFP_KERNEL); if (cnt_sleep && cnt_wake) { Loading Loading @@ -1285,6 +1294,7 @@ static struct device *msm_bus_device_init( bus_node->node_info = node_info; bus_node->ap_owned = pdata->ap_owned; bus_node->dirty = false; bus_dev->of_node = pdata->of_node; if (msm_bus_copy_node_info(pdata, bus_dev) < 0) { Loading Loading @@ -1649,9 +1659,11 @@ int __init msm_bus_device_late_init(void) int rc; MSM_BUS_ERR("msm_bus_late_init: Remove handoff bw requests\n"); init_time = false; rc = bus_for_each_dev(&msm_bus_type, NULL, NULL, bcm_remove_handoff_req); commit_late_init_data(); return rc; } subsys_initcall(msm_bus_device_init_driver); Loading
drivers/soc/qcom/msm_bus/msm_bus_rpmh.h +1 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ int msm_bus_enable_limiter(struct msm_bus_node_device_type *nodedev, int throttle_en, uint64_t lim_bw); int msm_bus_commit_data(struct list_head *clist); int bcm_remove_handoff_req(struct device *dev, void *data); void commit_late_init_data(void); int msm_bus_query_gen(struct list_head *qlist, struct msm_bus_tcs_usecase *tcs_usecase); void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size, Loading