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

Commit 4278142c authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: msm_bus: Enable QoS programming on adhoc driver"

parents 40394ea7 18827533
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -317,8 +317,8 @@ static uint64_t arbitrate_bus_req(struct msm_bus_node_device_type *bus_dev,
	}

	/* Account for multiple channels if any */
	if (bus_dev->node_info->num_ports > 1)
		sum_ab = msm_bus_div64(bus_dev->node_info->num_ports,
	if (bus_dev->node_info->num_qports > 1)
		sum_ab = msm_bus_div64(bus_dev->node_info->num_qports,
					sum_ab);

	if (!bus_dev->node_info->buswidth) {
+4 −7
Original line number Diff line number Diff line
@@ -1802,7 +1802,7 @@ static int msm_bus_bimc_qos_init(struct msm_bus_node_device_type *info,
		return 0;
	}

	for (i = 0; i < info->node_info->num_ports; i++) {
	for (i = 0; i < info->node_info->num_qports; i++) {
		/* If not in bypass mode, update priority */
		if (info->node_info->mode != BIMC_QOS_MODE_BYPASS) {
			msm_bus_bimc_set_qos_prio(qos_base, info->node_info->
@@ -1835,11 +1835,11 @@ static int msm_bus_bimc_set_bw(struct msm_bus_node_device_type *dev,
	int ret = 0;
	struct msm_bus_node_info_type *info = dev->node_info;

	if (info && info->num_ports) {
		bw = msm_bus_div64(info->num_ports,
	if (info && info->num_qports) {
		bw = msm_bus_div64(info->num_qports,
				dev->node_ab.ab[DUAL_CTX]);

		for (i = 0; i < info->num_ports; i++) {
		for (i = 0; i < info->num_qports; i++) {
			MSM_BUS_DBG("BIMC: Update mas_bw for ID: %d -> %llu\n",
				info->id, bw);

@@ -1859,9 +1859,6 @@ static int msm_bus_bimc_set_bw(struct msm_bus_node_device_type *dev,
			msm_bus_bimc_set_qos_bw(qos_base, qos_freq,
					info->qport[i], &qbw);
		}
	} else {
		ret = -ENODEV;
		MSM_BUS_ERR("%s: Cannot program BW regs", __func__);
	}
	return ret;
}
+20 −0
Original line number Diff line number Diff line
@@ -614,6 +614,7 @@ static int msm_bus_fabric_init(struct device *dev,
	fabdev->qos_range = pdata->fabdev->qos_range;
	fabdev->base_offset = pdata->fabdev->base_offset;
	fabdev->bus_type = pdata->fabdev->bus_type;
	fabdev->bypass_qos_prg = pdata->fabdev->bypass_qos_prg;
	msm_bus_fab_init_noc_ops(node_dev);

	fabdev->qos_base = devm_ioremap(dev,
@@ -685,6 +686,7 @@ static int msm_bus_copy_node_info(struct msm_bus_node_device_type *pdata,
	node_info->mas_rpm_id = pdata_node_info->mas_rpm_id;
	node_info->slv_rpm_id = pdata_node_info->slv_rpm_id;
	node_info->num_connections = pdata_node_info->num_connections;
	node_info->num_qports = pdata_node_info->num_qports;
	node_info->buswidth = pdata_node_info->buswidth;
	node_info->virt_dev = pdata_node_info->virt_dev;
	node_info->is_fab_dev = pdata_node_info->is_fab_dev;
@@ -716,6 +718,21 @@ static int msm_bus_copy_node_info(struct msm_bus_node_device_type *pdata,
		pdata_node_info->connections,
		sizeof(int) * pdata_node_info->num_connections);

	node_info->qport = devm_kzalloc(bus_dev,
			sizeof(int) * pdata_node_info->num_qports,
			GFP_KERNEL);
	if (!node_info->qport) {
		MSM_BUS_ERR("%s:Bus qport allocation failed\n", __func__);
		devm_kfree(bus_dev, node_info->dev_connections);
		devm_kfree(bus_dev, node_info->connections);
		ret = -ENOMEM;
		goto exit_copy_node_info;
	}

	memcpy(node_info->qport,
		pdata_node_info->qport,
		sizeof(int) * pdata_node_info->num_qports);

exit_copy_node_info:
	return ret;
}
@@ -759,6 +776,7 @@ static struct device *msm_bus_device_init(
	}

	bus_node->node_info = node_info;
	bus_node->ap_owned = pdata->ap_owned;
	bus_dev->platform_data = bus_node;

	if (msm_bus_copy_node_info(pdata, bus_dev) < 0) {
@@ -927,6 +945,8 @@ static int msm_bus_device_probe(struct platform_device *pdev)

	/* Register the arb layer ops */
	msm_bus_arb_setops_adhoc(&arb_ops);
	devm_kfree(&pdev->dev, pdata->info);
	devm_kfree(&pdev->dev, pdata);
exit_device_probe:
	return ret;
}
+4 −9
Original line number Diff line number Diff line
@@ -642,8 +642,6 @@ static int msm_bus_noc_qos_init(struct msm_bus_node_device_type *info,
	int ret = 0;
	int i;

	prio.read_prio = info->node_info->prio_rd;
	prio.write_prio = info->node_info->prio_wr;
	prio.p1 = info->node_info->prio1;
	prio.p0 = info->node_info->prio0;

@@ -653,7 +651,7 @@ static int msm_bus_noc_qos_init(struct msm_bus_node_device_type *info,
		goto err_qos_init;
	}

	for (i = 0; i < info->node_info->num_ports; i++) {
	for (i = 0; i < info->node_info->num_qports; i++) {
		if (info->node_info->mode != NOC_QOS_MODE_BYPASS) {
			noc_set_qos_priority(qos_base, qos_off, qos_delta,
					info->node_info->qport[i], &prio);
@@ -688,13 +686,13 @@ static int msm_bus_noc_set_bw(struct msm_bus_node_device_type *dev,
	int i;
	struct msm_bus_node_info_type *info = dev->node_info;

	if (info && info->num_ports) {
	if (info && info->num_qports) {
		struct msm_bus_noc_qos_bw qos_bw;

		bw = msm_bus_div64(info->num_ports,
		bw = msm_bus_div64(info->num_qports,
				dev->node_ab.ab[DUAL_CTX]);

		for (i = 0; i < info->num_ports; i++) {
		for (i = 0; i < info->num_qports; i++) {
			if (!info->qport) {
				MSM_BUS_DBG("No qos ports to update!\n");
				break;
@@ -708,9 +706,6 @@ static int msm_bus_noc_set_bw(struct msm_bus_node_device_type *dev,
			MSM_BUS_DBG("NOC: QoS: Update mas_bw: ws: %u\n",
				qos_bw.ws);
		}
	} else {
		MSM_BUS_ERR("%s: Can't program the BW regs", __func__);
		ret = -ENODEV;
	}
	return ret;
}
+41 −27
Original line number Diff line number Diff line
@@ -25,27 +25,26 @@
#include "msm_bus_core.h"
#include "msm_bus_adhoc.h"

#define DEFAULT_QOS_FREQ	19200

static int get_qos_mode(struct platform_device *pdev,
			struct device_node *node, const char *qos_mode)
{
	const char *qos_names[] = {"Fixed", "Limiter", "Bypass", "Regulator"};
	const char *qos_names[] = {"fixed", "limiter", "bypass", "regulator"};
	int i = 0;
	int ret = 0;
	int ret = -1;

	if (!qos_mode) {
		ret = 2;
	if (!qos_mode)
		goto exit_get_qos_mode;
	}

	for (i = 0; i < ARRAY_SIZE(qos_names); i++) {
		if (!strcmp(qos_mode, qos_names[i]))
			break;
	}
	if (i == ARRAY_SIZE(qos_names)) {
		ret = -1;
		dev_dbg(&pdev->dev, "Cannot match mode qos %s using Bypass",
	if (i == ARRAY_SIZE(qos_names))
		dev_err(&pdev->dev, "Cannot match mode qos %s using Bypass",
				qos_mode);
	} else
	else
		ret = i;

exit_get_qos_mode:
@@ -77,11 +76,11 @@ static int *get_arr(struct platform_device *pdev,
	ret = of_property_read_u32_array(node, prop, (u32 *)arr, *nports);
	if (ret) {
		dev_err(&pdev->dev, "Error in reading property: %s\n", prop);
		goto err;
		goto arr_err;
	}

	return arr;
err:
arr_err:
	devm_kfree(&pdev->dev, arr);
	return NULL;
}
@@ -107,14 +106,14 @@ static struct msm_bus_fab_device_type *get_fab_device_info(
	ret = of_property_read_string(dev_node, "qcom,base-name", &base_name);
	if (ret) {
		dev_err(&pdev->dev, "Error: Unable to get base address name\n");
		goto err;
		goto fab_dev_err;
	}

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, base_name);
	if (!res) {
		dev_err(&pdev->dev, "Error getting qos base addr %s\n",
								base_name);
		goto err;
		goto fab_dev_err;
	}
	fab_dev->pqos_base = res->start;
	fab_dev->qos_range = resource_size(res);
@@ -136,12 +135,19 @@ static struct msm_bus_fab_device_type *get_fab_device_info(
						&fab_dev->bus_type);
	if (ret) {
		dev_warn(&pdev->dev, "Bus type is missing\n");
		goto err;
		goto fab_dev_err;
	}

	ret = of_property_read_u32(dev_node, "qcom,qos-freq",
						&fab_dev->qos_freq);
	if (ret) {
		dev_dbg(&pdev->dev, "Bus qos freq is missing\n");
		fab_dev->qos_freq = DEFAULT_QOS_FREQ;
	}

	return fab_dev;

err:
fab_dev_err:
	devm_kfree(&pdev->dev, fab_dev);
	fab_dev = 0;
	return NULL;
@@ -171,12 +177,12 @@ static struct msm_bus_node_info_type *get_node_info_data(
	ret = of_property_read_u32(dev_node, "cell-id", &node_info->id);
	if (ret) {
		dev_warn(&pdev->dev, "Bus node is missing cell-id\n");
		goto err;
		goto node_info_err;
	}
	ret = of_property_read_string(dev_node, "label", &node_info->name);
	if (ret) {
		dev_warn(&pdev->dev, "Bus node is missing name\n");
		goto err;
		goto node_info_err;
	}
	node_info->qport = get_arr(pdev, dev_node, "qcom,qport",
			&node_info->num_qports);
@@ -193,11 +199,11 @@ static struct msm_bus_node_info_type *get_node_info_data(
	for (i = 0; i < node_info->num_connections; i++) {
		con_node = of_parse_phandle(dev_node, "qcom,connections", i);
		if (IS_ERR_OR_NULL(con_node))
			goto err;
			goto node_info_err;

		if (of_property_read_u32(con_node, "cell-id",
				&node_info->connections[i]))
			goto err;
			goto node_info_err;
		of_node_put(con_node);
	}

@@ -207,7 +213,7 @@ static struct msm_bus_node_info_type *get_node_info_data(
			&node_info->bus_device_id)) {
			dev_err(&pdev->dev, "Can't find bus device. Node %d",
					node_info->id);
			goto err;
			goto node_info_err;
		}

		of_node_put(bus_dev);
@@ -240,16 +246,24 @@ static struct msm_bus_node_info_type *get_node_info_data(
	}

	ret = of_property_read_string(dev_node, "qcom,qos-mode", &qos_mode);

	if (ret)
		node_info->mode = -1;
	else
		node_info->mode = get_qos_mode(pdev, dev_node, qos_mode);

	ret = of_property_read_u32(dev_node, "qcom,prio-lvl",
						&node_info->slv_rpm_id);
						&node_info->prio_lvl);
	ret = of_property_read_u32(dev_node, "qcom,prio1", &node_info->prio1);
	ret = of_property_read_u32(dev_node, "qcom,prio0", &node_info->prio0);
	ret = of_property_read_u32(dev_node, "qcom,prio-rd",
						&node_info->prio_rd);
	ret = of_property_read_u32(dev_node, "qcom,prio-wr",
						&node_info->prio_wr);

	return node_info;

err:
node_info_err:
	devm_kfree(&pdev->dev, node_info);
	node_info = 0;
	return NULL;
@@ -333,7 +347,7 @@ struct msm_bus_device_node_registration
	if (!pdata->info) {
		dev_err(&pdev->dev,
			"Error: Memory allocation for pdata->info failed\n");
		goto err;
		goto node_reg_err;
	}

	ret = 0;
@@ -342,7 +356,7 @@ struct msm_bus_device_node_registration
				&pdata->info[i]);
		if (ret) {
			dev_err(&pdev->dev, "Error: unable to initialize bus nodes\n");
			goto err_1;
			goto node_reg_err_1;
		}
		i++;
	}
@@ -370,9 +384,9 @@ struct msm_bus_device_node_registration
	}
	return pdata;

err_1:
node_reg_err_1:
	devm_kfree(&pdev->dev, pdata->info);
err:
node_reg_err:
	devm_kfree(&pdev->dev, pdata);
	pdata = NULL;
	return NULL;