Loading drivers/media/platform/msm/npu/npu_dev.c +27 −16 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ * Includes * ------------------------------------------------------------------------- */ #include <dt-bindings/msm/msm-bus-ids.h> #include <linux/clk.h> #include <linux/interrupt.h> #include <linux/irq.h> Loading Loading @@ -1646,15 +1647,15 @@ static int npu_parse_dt_regulator(struct npu_device *npu_dev) static int npu_parse_dt_bw(struct npu_device *npu_dev) { int ret, len; uint32_t ports[2]; int ret, len, num_paths, i; uint32_t ports[MAX_PATHS * 2]; struct platform_device *pdev = npu_dev->pdev; struct npu_bwctrl *bwctrl = &npu_dev->bwctrl; if (of_find_property(pdev->dev.of_node, "qcom,src-dst-ports", &len)) { len /= sizeof(ports[0]); if (len != 2) { NPU_ERR("Unexpected number of ports\n"); if (len % 2 || len > ARRAY_SIZE(ports)) { NPU_ERR("Unexpected number of ports %d\n", len); return -EINVAL; } Loading @@ -1664,6 +1665,7 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) NPU_ERR("Failed to read bw property\n"); return ret; } num_paths = len / 2; } else { NPU_ERR("can't find bw property\n"); return -EINVAL; Loading @@ -1676,13 +1678,15 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) bwctrl->bw_data.name = dev_name(&pdev->dev); bwctrl->bw_data.active_only = false; bwctrl->bw_levels[0].vectors[0].src = ports[0]; bwctrl->bw_levels[0].vectors[0].dst = ports[1]; bwctrl->bw_levels[1].vectors[0].src = ports[0]; bwctrl->bw_levels[1].vectors[0].dst = ports[1]; bwctrl->bw_levels[0].num_paths = 1; bwctrl->bw_levels[1].num_paths = 1; bwctrl->num_paths = 1; for (i = 0; i < num_paths; i++) { bwctrl->bw_levels[0].vectors[i].src = ports[2 * i]; bwctrl->bw_levels[0].vectors[i].dst = ports[2 * i + 1]; bwctrl->bw_levels[1].vectors[i].src = ports[2 * i]; bwctrl->bw_levels[1].vectors[i].dst = ports[2 * i + 1]; } bwctrl->bw_levels[0].num_paths = num_paths; bwctrl->bw_levels[1].num_paths = num_paths; bwctrl->num_paths = num_paths; bwctrl->bus_client = msm_bus_scale_register_client(&bwctrl->bw_data); if (!bwctrl->bus_client) { Loading @@ -1697,7 +1701,7 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) int npu_set_bw(struct npu_device *npu_dev, int new_ib, int new_ab) { int i, ret; int i, j, ret; struct npu_bwctrl *bwctrl = &npu_dev->bwctrl; if (!bwctrl->bus_client) { Loading @@ -1710,10 +1714,17 @@ int npu_set_bw(struct npu_device *npu_dev, int new_ib, int new_ab) i = (bwctrl->cur_idx + 1) % DBL_BUF; bwctrl->bw_levels[i].vectors[0].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[0].ab = new_ab / bwctrl->num_paths * MBYTE; bwctrl->bw_levels[i].vectors[1].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[1].ab = new_ab / bwctrl->num_paths * MBYTE; for (j = 0; j < bwctrl->num_paths; j++) { if ((bwctrl->bw_levels[i].vectors[j].dst == MSM_BUS_SLAVE_CLK_CTL) && (new_ib > 0)) { bwctrl->bw_levels[i].vectors[j].ib = 1; bwctrl->bw_levels[i].vectors[j].ab = 1; } else { bwctrl->bw_levels[i].vectors[j].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[j].ab = new_ab * MBYTE / bwctrl->num_paths; } } ret = msm_bus_scale_client_update_request(bwctrl->bus_client, i); if (ret) { Loading Loading
drivers/media/platform/msm/npu/npu_dev.c +27 −16 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ * Includes * ------------------------------------------------------------------------- */ #include <dt-bindings/msm/msm-bus-ids.h> #include <linux/clk.h> #include <linux/interrupt.h> #include <linux/irq.h> Loading Loading @@ -1646,15 +1647,15 @@ static int npu_parse_dt_regulator(struct npu_device *npu_dev) static int npu_parse_dt_bw(struct npu_device *npu_dev) { int ret, len; uint32_t ports[2]; int ret, len, num_paths, i; uint32_t ports[MAX_PATHS * 2]; struct platform_device *pdev = npu_dev->pdev; struct npu_bwctrl *bwctrl = &npu_dev->bwctrl; if (of_find_property(pdev->dev.of_node, "qcom,src-dst-ports", &len)) { len /= sizeof(ports[0]); if (len != 2) { NPU_ERR("Unexpected number of ports\n"); if (len % 2 || len > ARRAY_SIZE(ports)) { NPU_ERR("Unexpected number of ports %d\n", len); return -EINVAL; } Loading @@ -1664,6 +1665,7 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) NPU_ERR("Failed to read bw property\n"); return ret; } num_paths = len / 2; } else { NPU_ERR("can't find bw property\n"); return -EINVAL; Loading @@ -1676,13 +1678,15 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) bwctrl->bw_data.name = dev_name(&pdev->dev); bwctrl->bw_data.active_only = false; bwctrl->bw_levels[0].vectors[0].src = ports[0]; bwctrl->bw_levels[0].vectors[0].dst = ports[1]; bwctrl->bw_levels[1].vectors[0].src = ports[0]; bwctrl->bw_levels[1].vectors[0].dst = ports[1]; bwctrl->bw_levels[0].num_paths = 1; bwctrl->bw_levels[1].num_paths = 1; bwctrl->num_paths = 1; for (i = 0; i < num_paths; i++) { bwctrl->bw_levels[0].vectors[i].src = ports[2 * i]; bwctrl->bw_levels[0].vectors[i].dst = ports[2 * i + 1]; bwctrl->bw_levels[1].vectors[i].src = ports[2 * i]; bwctrl->bw_levels[1].vectors[i].dst = ports[2 * i + 1]; } bwctrl->bw_levels[0].num_paths = num_paths; bwctrl->bw_levels[1].num_paths = num_paths; bwctrl->num_paths = num_paths; bwctrl->bus_client = msm_bus_scale_register_client(&bwctrl->bw_data); if (!bwctrl->bus_client) { Loading @@ -1697,7 +1701,7 @@ static int npu_parse_dt_bw(struct npu_device *npu_dev) int npu_set_bw(struct npu_device *npu_dev, int new_ib, int new_ab) { int i, ret; int i, j, ret; struct npu_bwctrl *bwctrl = &npu_dev->bwctrl; if (!bwctrl->bus_client) { Loading @@ -1710,10 +1714,17 @@ int npu_set_bw(struct npu_device *npu_dev, int new_ib, int new_ab) i = (bwctrl->cur_idx + 1) % DBL_BUF; bwctrl->bw_levels[i].vectors[0].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[0].ab = new_ab / bwctrl->num_paths * MBYTE; bwctrl->bw_levels[i].vectors[1].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[1].ab = new_ab / bwctrl->num_paths * MBYTE; for (j = 0; j < bwctrl->num_paths; j++) { if ((bwctrl->bw_levels[i].vectors[j].dst == MSM_BUS_SLAVE_CLK_CTL) && (new_ib > 0)) { bwctrl->bw_levels[i].vectors[j].ib = 1; bwctrl->bw_levels[i].vectors[j].ab = 1; } else { bwctrl->bw_levels[i].vectors[j].ib = new_ib * MBYTE; bwctrl->bw_levels[i].vectors[j].ab = new_ab * MBYTE / bwctrl->num_paths; } } ret = msm_bus_scale_client_update_request(bwctrl->bus_client, i); if (ret) { Loading