Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78d4c30c authored by Girish Mahadevan's avatar Girish Mahadevan Committed by Gerrit - the friendly Code Review server
Browse files

msm: msm_bus: Modify state machine handling for rules engine



Evaluate every rule for a given node when a bus transaction happens and
apply the first matched rule allowing for multiple rules to be applicable
but apply the most restrictive.

Change-Id: I25018ac4260916fd5c42d8a73b886b13a0d2b3a0
Signed-off-by: default avatarGirish Mahadevan <girishm@codeaurora.org>
parent b67c33b9
Loading
Loading
Loading
Loading
+19 −29
Original line number Diff line number Diff line
@@ -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;
@@ -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;
				}
			}
		}
	}
@@ -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;
@@ -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;
		}
	}

+30 −0
Original line number Diff line number Diff line
@@ -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),