Commit c192026c authored by Yicong Yang's avatar Yicong Yang Committed by Will Deacon
Browse files

drivers/perf: hisi: Extract topology information to a separate structure



HiSilicon Uncore PMUs are identified by the IDs of the topology element
on which the PMUs are located. Add a new separate struct hisi_pmu_toplogy
to encapsulate this information. Add additional documentation on the
meaning of each ID.

- make sccl_id and sicl_id into a union since they're exclusive. It can
  also be accessed by scl_id if the SICL/SCCL distinction is not
  relevant
- make index_id and sub_id signed so -1 may be used to indicate the PMU
  doesn't have this topology element or it could not be retrieved.

This patch should have no functional changes.

Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Link: https://lore.kernel.org/r/20241210141525.37788-6-yangyicong@huawei.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 6cd13708
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -181,19 +181,19 @@ static int hisi_cpa_pmu_init_data(struct platform_device *pdev,
				  struct hisi_pmu *cpa_pmu)
{
	if (device_property_read_u32(&pdev->dev, "hisilicon,scl-id",
				     &cpa_pmu->sicl_id)) {
				     &cpa_pmu->topo.sicl_id)) {
		dev_err(&pdev->dev, "Can not read sicl-id\n");
		return -EINVAL;
	}

	if (device_property_read_u32(&pdev->dev, "hisilicon,idx-id",
				     &cpa_pmu->index_id)) {
				     &cpa_pmu->topo.index_id)) {
		dev_err(&pdev->dev, "Cannot read idx-id\n");
		return -EINVAL;
	}

	cpa_pmu->ccl_id = -1;
	cpa_pmu->sccl_id = -1;
	cpa_pmu->topo.ccl_id = -1;
	cpa_pmu->topo.sccl_id = -1;
	cpa_pmu->base = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(cpa_pmu->base))
		return PTR_ERR(cpa_pmu->base);
@@ -311,8 +311,8 @@ static int hisi_cpa_pmu_probe(struct platform_device *pdev)
	if (ret)
		return ret;

	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sicl%d_cpa%u",
			      cpa_pmu->sicl_id, cpa_pmu->index_id);
	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sicl%d_cpa%d",
			      cpa_pmu->topo.sicl_id, cpa_pmu->topo.index_id);
	if (!name)
		return -ENOMEM;

+9 −9
Original line number Diff line number Diff line
@@ -302,18 +302,18 @@ static int hisi_ddrc_pmu_init_data(struct platform_device *pdev,
	 * DDRC PMU, while SCCL_ID is in MPIDR[aff2].
	 */
	if (device_property_read_u32(&pdev->dev, "hisilicon,ch-id",
				     &ddrc_pmu->index_id)) {
				     &ddrc_pmu->topo.index_id)) {
		dev_err(&pdev->dev, "Can not read ddrc channel-id!\n");
		return -EINVAL;
	}

	if (device_property_read_u32(&pdev->dev, "hisilicon,scl-id",
				     &ddrc_pmu->sccl_id)) {
				     &ddrc_pmu->topo.sccl_id)) {
		dev_err(&pdev->dev, "Can not read ddrc sccl-id!\n");
		return -EINVAL;
	}
	/* DDRC PMUs only share the same SCCL */
	ddrc_pmu->ccl_id = -1;
	ddrc_pmu->topo.ccl_id = -1;

	ddrc_pmu->base = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(ddrc_pmu->base)) {
@@ -324,7 +324,7 @@ static int hisi_ddrc_pmu_init_data(struct platform_device *pdev,
	ddrc_pmu->identifier = readl(ddrc_pmu->base + DDRC_VERSION);
	if (ddrc_pmu->identifier >= HISI_PMU_V2) {
		if (device_property_read_u32(&pdev->dev, "hisilicon,sub-id",
					     &ddrc_pmu->sub_id)) {
					     &ddrc_pmu->topo.sub_id)) {
			dev_err(&pdev->dev, "Can not read sub-id!\n");
			return -EINVAL;
		}
@@ -501,13 +501,13 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)

	if (ddrc_pmu->identifier >= HISI_PMU_V2)
		name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
				      "hisi_sccl%u_ddrc%u_%u",
				      ddrc_pmu->sccl_id, ddrc_pmu->index_id,
				      ddrc_pmu->sub_id);
				      "hisi_sccl%d_ddrc%d_%d",
				      ddrc_pmu->topo.sccl_id, ddrc_pmu->topo.index_id,
				      ddrc_pmu->topo.sub_id);
	else
		name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
				      "hisi_sccl%u_ddrc%u", ddrc_pmu->sccl_id,
				      ddrc_pmu->index_id);
				      "hisi_sccl%d_ddrc%d", ddrc_pmu->topo.sccl_id,
				      ddrc_pmu->topo.index_id);

	if (!name)
		return -ENOMEM;
+6 −6
Original line number Diff line number Diff line
@@ -300,7 +300,7 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev,
	 * SCCL_ID is in MPIDR[aff2].
	 */
	if (device_property_read_u32(&pdev->dev, "hisilicon,scl-id",
				     &hha_pmu->sccl_id)) {
				     &hha_pmu->topo.sccl_id)) {
		dev_err(&pdev->dev, "Can not read hha sccl-id!\n");
		return -EINVAL;
	}
@@ -310,7 +310,7 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev,
	 * both "hisilicon, idx-id" as preference, if available.
	 */
	if (device_property_read_u32(&pdev->dev, "hisilicon,idx-id",
				     &hha_pmu->index_id)) {
				     &hha_pmu->topo.index_id)) {
		status = acpi_evaluate_integer(ACPI_HANDLE(&pdev->dev),
					       "_UID", NULL, &id);
		if (ACPI_FAILURE(status)) {
@@ -318,10 +318,10 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev,
			return -EINVAL;
		}

		hha_pmu->index_id = id;
		hha_pmu->topo.index_id = id;
	}
	/* HHA PMUs only share the same SCCL */
	hha_pmu->ccl_id = -1;
	hha_pmu->topo.ccl_id = -1;

	hha_pmu->base = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(hha_pmu->base)) {
@@ -510,8 +510,8 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
	if (ret)
		return ret;

	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_hha%u",
			      hha_pmu->sccl_id, hha_pmu->index_id);
	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%d_hha%d",
			      hha_pmu->topo.sccl_id, hha_pmu->topo.index_id);
	if (!name)
		return -ENOMEM;

+4 −4
Original line number Diff line number Diff line
@@ -360,13 +360,13 @@ static int hisi_l3c_pmu_init_data(struct platform_device *pdev,
	 * SCCL_ID is in MPIDR[aff2] and CCL_ID is in MPIDR[aff1].
	 */
	if (device_property_read_u32(&pdev->dev, "hisilicon,scl-id",
				     &l3c_pmu->sccl_id)) {
				     &l3c_pmu->topo.sccl_id)) {
		dev_err(&pdev->dev, "Can not read l3c sccl-id!\n");
		return -EINVAL;
	}

	if (device_property_read_u32(&pdev->dev, "hisilicon,ccl-id",
				     &l3c_pmu->ccl_id)) {
				     &l3c_pmu->topo.ccl_id)) {
		dev_err(&pdev->dev, "Can not read l3c ccl-id!\n");
		return -EINVAL;
	}
@@ -544,8 +544,8 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
	if (ret)
		return ret;

	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%u_l3c%u",
			      l3c_pmu->sccl_id, l3c_pmu->ccl_id);
	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sccl%d_l3c%d",
			      l3c_pmu->topo.sccl_id, l3c_pmu->topo.ccl_id);
	if (!name)
		return -ENOMEM;

+7 −7
Original line number Diff line number Diff line
@@ -274,19 +274,19 @@ static int hisi_pa_pmu_init_data(struct platform_device *pdev,
	 * to identify the PA PMU.
	 */
	if (device_property_read_u32(&pdev->dev, "hisilicon,scl-id",
				     &pa_pmu->sicl_id)) {
				     &pa_pmu->topo.sicl_id)) {
		dev_err(&pdev->dev, "Cannot read sicl-id!\n");
		return -EINVAL;
	}

	if (device_property_read_u32(&pdev->dev, "hisilicon,idx-id",
				     &pa_pmu->index_id)) {
				     &pa_pmu->topo.index_id)) {
		dev_err(&pdev->dev, "Cannot read idx-id!\n");
		return -EINVAL;
	}

	pa_pmu->ccl_id = -1;
	pa_pmu->sccl_id = -1;
	pa_pmu->topo.ccl_id = -1;
	pa_pmu->topo.sccl_id = -1;

	pa_pmu->dev_info = device_get_match_data(&pdev->dev);
	if (!pa_pmu->dev_info)
@@ -488,9 +488,9 @@ static int hisi_pa_pmu_probe(struct platform_device *pdev)
	if (ret)
		return ret;

	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sicl%d_%s%u",
			      pa_pmu->sicl_id, pa_pmu->dev_info->name,
			      pa_pmu->index_id);
	name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "hisi_sicl%d_%s%d",
			      pa_pmu->topo.sicl_id, pa_pmu->dev_info->name,
			      pa_pmu->topo.index_id);
	if (!name)
		return -ENOMEM;

Loading