Loading drivers/platform/msm/msm_bus/msm_bus_rules.c +19 −29 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #include <linux/msm_bus_rules.h> #include <linux/slab.h> #include <linux/types.h> #include <trace/events/trace_msm_bus.h> struct node_vote_info { int id; Loading Loading @@ -207,41 +208,24 @@ static void match_rule(struct rule_update_path_info *inp_node, { struct rules_def *rule; int i; bool match_found = false; bool relevant_trans = false; list_for_each_entry(rule, &node->node_rules, link) { for (i = 0; i < rule->num_src; i++) { if (rule->src_info[i].id == inp_node->id) { relevant_trans = true; if (check_rule(rule, inp_node)) { node->cur_rule = rule->rule_id; trace_bus_rules_matches(node->cur_rule, inp_node->id, inp_node->ab, inp_node->ib, inp_node->clk); if (rule->state == RULE_STATE_NOT_APPLIED) { rule->state = RULE_STATE_APPLIED; RULE_STATE_NOT_APPLIED) rule->state_change = true; match_found = true; } break; } } } if (match_found) break; } if (!relevant_trans) return; if (!match_found) node->cur_rule = -1; list_for_each_entry(rule, &node->node_rules, link) { if (rule->rule_id != node->cur_rule) { if (rule->state == RULE_STATE_APPLIED) { rule->state = RULE_STATE_NOT_APPLIED; rule->state = RULE_STATE_APPLIED; } else { if (rule->state == RULE_STATE_APPLIED) rule->state_change = true; rule->state = RULE_STATE_NOT_APPLIED; } } } } Loading @@ -252,7 +236,12 @@ static void apply_rule(struct rule_node_info *node, { struct rules_def *rule; node->cur_rule = -1; list_for_each_entry(rule, &node->node_rules, link) { if ((rule->state == RULE_STATE_APPLIED) && (node->cur_rule == -1)) node->cur_rule = rule->rule_id; if (node->id == NB_ID) { if (rule->state_change) { rule->state_change = false; Loading @@ -260,13 +249,14 @@ static void apply_rule(struct rule_node_info *node, rule->state, (void *)&rule->rule_ops); } } else { rule->state_change = false; if ((rule->state == RULE_STATE_APPLIED)) { if ((rule->state == RULE_STATE_APPLIED) && (node->cur_rule == rule->rule_id)) { node->apply.id = rule->rule_ops.dst_node[0]; node->apply.throttle = rule->rule_ops.mode; node->apply.lim_bw = rule->rule_ops.dst_bw; list_add_tail(&node->apply.link, output_list); } rule->state_change = false; } } Loading include/trace/events/trace_msm_bus.h +30 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,36 @@ TRACE_EVENT(bus_avail_bw, (unsigned long long)__entry->cur_mdp_bw) ); TRACE_EVENT(bus_rules_matches, TP_PROTO(int node_id, int rule_id, unsigned long long node_ab, unsigned long long node_ib, unsigned long long node_clk), TP_ARGS(node_id, rule_id, node_ab, node_ib, node_clk), TP_STRUCT__entry( __field(int, node_id) __field(int, rule_id) __field(u64, node_ab) __field(u64, node_ib) __field(u64, node_clk) ), TP_fast_assign( __entry->node_id = node_id; __entry->rule_id = rule_id; __entry->node_ab = node_ab; __entry->node_ib = node_ib; __entry->node_clk = node_clk; ), TP_printk("Rule match node%d rule%d node-ab%llu:ib%llu:clk%llu", __entry->node_id, __entry->rule_id, (unsigned long long)__entry->node_ab, (unsigned long long)__entry->node_ib, (unsigned long long)__entry->node_clk) ); TRACE_EVENT(bus_bke_params, TP_PROTO(u32 gc, u32 gp, u32 thl, u32 thm, u32 thh), Loading Loading
drivers/platform/msm/msm_bus/msm_bus_rules.c +19 −29 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #include <linux/msm_bus_rules.h> #include <linux/slab.h> #include <linux/types.h> #include <trace/events/trace_msm_bus.h> struct node_vote_info { int id; Loading Loading @@ -207,41 +208,24 @@ static void match_rule(struct rule_update_path_info *inp_node, { struct rules_def *rule; int i; bool match_found = false; bool relevant_trans = false; list_for_each_entry(rule, &node->node_rules, link) { for (i = 0; i < rule->num_src; i++) { if (rule->src_info[i].id == inp_node->id) { relevant_trans = true; if (check_rule(rule, inp_node)) { node->cur_rule = rule->rule_id; trace_bus_rules_matches(node->cur_rule, inp_node->id, inp_node->ab, inp_node->ib, inp_node->clk); if (rule->state == RULE_STATE_NOT_APPLIED) { rule->state = RULE_STATE_APPLIED; RULE_STATE_NOT_APPLIED) rule->state_change = true; match_found = true; } break; } } } if (match_found) break; } if (!relevant_trans) return; if (!match_found) node->cur_rule = -1; list_for_each_entry(rule, &node->node_rules, link) { if (rule->rule_id != node->cur_rule) { if (rule->state == RULE_STATE_APPLIED) { rule->state = RULE_STATE_NOT_APPLIED; rule->state = RULE_STATE_APPLIED; } else { if (rule->state == RULE_STATE_APPLIED) rule->state_change = true; rule->state = RULE_STATE_NOT_APPLIED; } } } } Loading @@ -252,7 +236,12 @@ static void apply_rule(struct rule_node_info *node, { struct rules_def *rule; node->cur_rule = -1; list_for_each_entry(rule, &node->node_rules, link) { if ((rule->state == RULE_STATE_APPLIED) && (node->cur_rule == -1)) node->cur_rule = rule->rule_id; if (node->id == NB_ID) { if (rule->state_change) { rule->state_change = false; Loading @@ -260,13 +249,14 @@ static void apply_rule(struct rule_node_info *node, rule->state, (void *)&rule->rule_ops); } } else { rule->state_change = false; if ((rule->state == RULE_STATE_APPLIED)) { if ((rule->state == RULE_STATE_APPLIED) && (node->cur_rule == rule->rule_id)) { node->apply.id = rule->rule_ops.dst_node[0]; node->apply.throttle = rule->rule_ops.mode; node->apply.lim_bw = rule->rule_ops.dst_bw; list_add_tail(&node->apply.link, output_list); } rule->state_change = false; } } Loading
include/trace/events/trace_msm_bus.h +30 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,36 @@ TRACE_EVENT(bus_avail_bw, (unsigned long long)__entry->cur_mdp_bw) ); TRACE_EVENT(bus_rules_matches, TP_PROTO(int node_id, int rule_id, unsigned long long node_ab, unsigned long long node_ib, unsigned long long node_clk), TP_ARGS(node_id, rule_id, node_ab, node_ib, node_clk), TP_STRUCT__entry( __field(int, node_id) __field(int, rule_id) __field(u64, node_ab) __field(u64, node_ib) __field(u64, node_clk) ), TP_fast_assign( __entry->node_id = node_id; __entry->rule_id = rule_id; __entry->node_ab = node_ab; __entry->node_ib = node_ib; __entry->node_clk = node_clk; ), TP_printk("Rule match node%d rule%d node-ab%llu:ib%llu:clk%llu", __entry->node_id, __entry->rule_id, (unsigned long long)__entry->node_ab, (unsigned long long)__entry->node_ib, (unsigned long long)__entry->node_clk) ); TRACE_EVENT(bus_bke_params, TP_PROTO(u32 gc, u32 gp, u32 thl, u32 thm, u32 thh), Loading