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

Commit dcba2350 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "geni-qcom-se: Correct the BW update logic"

parents ab21bdd5 cdac77cf
Loading
Loading
Loading
Loading
+24 −12
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ struct bus_vectors {
 * @num_paths:		Two paths. QUPv3 clock and DDR paths.
 * @num_usecases:	One usecase to vote for both QUPv3 clock and DDR paths.
 * @pdata:		To register our client handle with the ICB driver.
 * @update:		Usecase index for icb voting.
 */
struct geni_se_device {
	struct device *dev;
@@ -112,6 +113,7 @@ struct geni_se_device {
	int num_paths;
	int num_usecases;
	struct msm_bus_scale_pdata *pdata;
	int update;
};

/* Offset of QUPV3 Hardware Version Register */
@@ -711,11 +713,14 @@ static int geni_se_rmv_ab_ib(struct geni_se_device *geni_se_dev,
	bool bus_bw_update = false;
	bool bus_bw_update_noc = false;
	int ret = 0;
	int new_update;

	if (unlikely(list_empty(&rsc->ab_list) || list_empty(&rsc->ib_list)))
		return -EINVAL;

	mutex_lock(&geni_se_dev->geni_dev_lock);

	new_update = geni_se_dev->update ? 0 : 1;
	list_del_init(&rsc->ab_list);
	geni_se_dev->cur_ab -= rsc->ab;

@@ -730,9 +735,9 @@ static int geni_se_rmv_ab_ib(struct geni_se_device *geni_se_dev,
	bus_bw_update = geni_se_check_bus_bw(geni_se_dev);

	if (geni_se_dev->num_paths == 2) {
		geni_se_dev->pdata->usecase[1].vectors[0].ab  =
		geni_se_dev->pdata->usecase[new_update].vectors[0].ab  =
			CONV_TO_BW(geni_se_dev->cur_ab);
		geni_se_dev->pdata->usecase[1].vectors[0].ib  =
		geni_se_dev->pdata->usecase[new_update].vectors[0].ib  =
			CONV_TO_BW(geni_se_dev->cur_ib);
	}

@@ -764,14 +769,16 @@ static int geni_se_rmv_ab_ib(struct geni_se_device *geni_se_dev,

		bus_bw_update_noc = geni_se_check_bus_bw_noc(geni_se_dev);

			geni_se_dev->pdata->usecase[1].vectors[1].ab  =
		geni_se_dev->pdata->usecase[new_update].vectors[1].ab  =
				geni_se_dev->cur_ab_noc;
			geni_se_dev->pdata->usecase[1].vectors[1].ib  =
		geni_se_dev->pdata->usecase[new_update].vectors[1].ib  =
				geni_se_dev->cur_ib_noc;

		if (bus_bw_update_noc || bus_bw_update)
		if (bus_bw_update_noc || bus_bw_update) {
			geni_se_dev->update = new_update;
			ret = msm_bus_scale_client_update_request
						(geni_se_dev->bus_bw_noc, 1);
					(geni_se_dev->bus_bw_noc, new_update);
		}
		GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
			"%s: %s: cur_ab_ib_noc(%lu:%lu) req_ab_ib_noc(%lu:%lu) %d\n",
			__func__, dev_name(rsc->ctrl_dev),
@@ -857,9 +864,11 @@ static int geni_se_add_ab_ib(struct geni_se_device *geni_se_dev,
	bool bus_bw_update = false;
	bool bus_bw_update_noc = false;
	int ret = 0;
	int new_update;

	mutex_lock(&geni_se_dev->geni_dev_lock);

	new_update = geni_se_dev->update ? 0 : 1;
	list_add(&rsc->ab_list, &geni_se_dev->ab_list_head);
	geni_se_dev->cur_ab += rsc->ab;

@@ -877,9 +886,9 @@ static int geni_se_add_ab_ib(struct geni_se_device *geni_se_dev,
	bus_bw_update = geni_se_check_bus_bw(geni_se_dev);

	if (geni_se_dev->num_paths == 2) {
		geni_se_dev->pdata->usecase[1].vectors[0].ab  =
		geni_se_dev->pdata->usecase[new_update].vectors[0].ab  =
			CONV_TO_BW(geni_se_dev->cur_ab);
		geni_se_dev->pdata->usecase[1].vectors[0].ib  =
		geni_se_dev->pdata->usecase[new_update].vectors[0].ib  =
			CONV_TO_BW(geni_se_dev->cur_ib);
	}

@@ -913,13 +922,15 @@ static int geni_se_add_ab_ib(struct geni_se_device *geni_se_dev,

		bus_bw_update_noc = geni_se_check_bus_bw_noc(geni_se_dev);

			geni_se_dev->pdata->usecase[1].vectors[1].ab  =
		geni_se_dev->pdata->usecase[new_update].vectors[1].ab  =
				geni_se_dev->cur_ab_noc;
			geni_se_dev->pdata->usecase[1].vectors[1].ib  =
		geni_se_dev->pdata->usecase[new_update].vectors[1].ib  =
				geni_se_dev->cur_ib_noc;
		if (bus_bw_update_noc || bus_bw_update)
		if (bus_bw_update_noc || bus_bw_update) {
			geni_se_dev->update = new_update;
			ret = msm_bus_scale_client_update_request
						(geni_se_dev->bus_bw_noc, 1);
					(geni_se_dev->bus_bw_noc, new_update);
		}
		GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
			"%s: %s: cur_ab_ib_noc(%lu:%lu) req_ab_ib_noc(%lu:%lu) %d\n",
			__func__, dev_name(rsc->ctrl_dev),
@@ -1760,6 +1771,7 @@ static int geni_se_probe(struct platform_device *pdev)
	ret = of_property_read_u32(dev->of_node, "qcom,msm-bus,num-paths",
					&geni_se_dev->num_paths);
	if (!ret) {
		geni_se_dev->update = 0;
		geni_se_dev->pdata = ab_ib_register(pdev, geni_se_dev);
		if (geni_se_dev->pdata == NULL) {
			dev_err(dev,