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

Commit 7456d977 authored by Dan Sneddon's avatar Dan Sneddon
Browse files

msm: msm_bus: Add node specific bus aggregation properties



Adding Node level bus aggregation properties. If util factor or vrail is
not defined as part of node then take fab level util factor or vrial in
consideration while doing bus aggregation.

This will be helpful in cases where different kind of masters are
connected to same NOC.

Change-Id: I0549a2ba98de1d6a98a91d6bf8b265652a5d334a
Signed-off-by: default avatarAlok Chauhan <alokc@codeaurora.org>
Signed-off-by: default avatarDan Sneddon <dsneddon@codeaurora.org>
parent 15d5ea13
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@ struct msm_bus_node_info_type {
	unsigned int buswidth;
	struct rule_update_path_info rule;
	uint64_t lim_bw;
	uint32_t util_fact;
	uint32_t vrail_comp;
};

struct msm_bus_node_device_type {
+12 −4
Original line number Diff line number Diff line
@@ -397,6 +397,8 @@ static uint64_t arbitrate_bus_req(struct msm_bus_node_device_type *bus_dev,
	uint64_t sum_ab = 0;
	uint64_t bw_max_hz;
	struct msm_bus_node_device_type *fab_dev = NULL;
	uint32_t util_fact = 0;
	uint32_t vrail_comp = 0;

	/* Find max ib */
	for (i = 0; i < bus_dev->num_lnodes; i++) {
@@ -408,17 +410,23 @@ static uint64_t arbitrate_bus_req(struct msm_bus_node_device_type *bus_dev,
	 *  formula is:
	 *  Freq_hz = max((sum(ab) * util_fact)/num_chan, max(ib)/vrail_comp)
	 *				/ bus-width
	 *  util_fact and vrail comp are obtained from fabric's dts properties.
	 *  util_fact and vrail comp are obtained from fabric/Node's dts
	 *  properties.
	 *  They default to 100 if absent.
	 */
	fab_dev = bus_dev->node_info->bus_device->platform_data;

	/* Don't do this for virtual fabrics */
	if (fab_dev && fab_dev->fabdev) {
		sum_ab *= fab_dev->fabdev->util_fact;
		util_fact = bus_dev->node_info->util_fact ?
			bus_dev->node_info->util_fact :
			fab_dev->fabdev->util_fact;
		vrail_comp = bus_dev->node_info->vrail_comp ?
			bus_dev->node_info->vrail_comp :
			fab_dev->fabdev->vrail_comp;
		sum_ab *= util_fact;
		sum_ab = msm_bus_div64(100, sum_ab);
		max_ib *= 100;
		max_ib = msm_bus_div64(fab_dev->fabdev->vrail_comp, max_ib);
		max_ib = msm_bus_div64(vrail_comp, max_ib);
	}

	/* Account for multiple channels if any */
+37 −0
Original line number Diff line number Diff line
@@ -23,6 +23,40 @@
#include "msm_bus_noc.h"
#include "msm_bus_bimc.h"

ssize_t vrail_show(struct device *dev, struct device_attribute *attr,
			  char *buf)
{
	struct msm_bus_node_info_type *node_info = NULL;
	struct msm_bus_node_device_type *bus_node = NULL;

	bus_node = dev->platform_data;
	if (!bus_node)
		return -EINVAL;
	node_info = bus_node->node_info;

	return snprintf(buf, PAGE_SIZE, "%u", node_info->vrail_comp);
}

ssize_t vrail_store(struct device *dev, struct device_attribute *attr,
			   const char *buf, size_t count)
{
	struct msm_bus_node_info_type *node_info = NULL;
	struct msm_bus_node_device_type *bus_node = NULL;
	int ret = 0;

	bus_node = dev->platform_data;
	if (!bus_node)
		return -EINVAL;
	node_info = bus_node->node_info;

	ret = sscanf(buf, "%u", &node_info->vrail_comp);
	if (ret != 1)
		return -EINVAL;
	return count;
}

DEVICE_ATTR(vrail, 0600, vrail_show, vrail_store);

struct static_rules_type {
	int num_rules;
	struct bus_rule_type *rules;
@@ -839,6 +873,8 @@ static int msm_bus_copy_node_info(struct msm_bus_node_device_type *pdata,
	node_info->qos_params.thmp = pdata_node_info->qos_params.thmp;
	node_info->qos_params.ws = pdata_node_info->qos_params.ws;
	node_info->qos_params.bw_buffer = pdata_node_info->qos_params.bw_buffer;
	node_info->util_fact = pdata_node_info->util_fact;
	node_info->vrail_comp = pdata_node_info->vrail_comp;

	node_info->dev_connections = devm_kzalloc(bus_dev,
			sizeof(struct device *) *
@@ -981,6 +1017,7 @@ static struct device *msm_bus_device_init(
		bus_dev = NULL;
		goto exit_device_init;
	}
	device_create_file(bus_dev, &dev_attr_vrail);

exit_device_init:
	return bus_dev;
+8 −0
Original line number Diff line number Diff line
@@ -333,6 +333,14 @@ static struct msm_bus_node_info_type *get_node_info_data(
		dev_dbg(&pdev->dev, "slv rpm id is missing\n");
		node_info->slv_rpm_id = -1;
	}
	ret = of_property_read_u32(dev_node, "qcom,util-fact",
						&node_info->util_fact);
	if (ret)
		node_info->util_fact = 0;
	ret = of_property_read_u32(dev_node, "qcom,vrail-comp",
						&node_info->vrail_comp);
	if (ret)
		node_info->vrail_comp = 0;
	get_qos_params(dev_node, pdev, node_info);

	return node_info;