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

Commit 62c04a6a authored by David Dai's avatar David Dai Committed by Gerrit - the friendly Code Review server
Browse files

msm: msm_bus: Disallow 0 bw requests during early init



Any clients attempting to request 0 bandwidth during init time
is not immediately honored and flushed out at late init. This is
to prevent clients from turning off vital shared resources that
other clients may need but have not had a chance to probe and vote
yet.

Change-Id: I2e237a1d537720ad8e53c2cf38ab024273186a30
Signed-off-by: default avatarDavid Dai <daidavid1@codeaurora.org>
parent bee66230
Loading
Loading
Loading
Loading
+33 −18
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
@@ -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 =
+16 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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);
	}
@@ -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++;
@@ -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) {
@@ -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) {
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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,