On Thu, Jan 07, 2021 at 12:38:54PM +0000, Suzuki K Poulose wrote:
CoreSight ETM with system register access may not have a memory mapped i/o access. Refactor the ETM specific probing into a common routine to allow reusing the code for such ETMs.
Cc: Mike Leach mike.leach@linaro.org Reviewed-by: Mathieu Poirier mathieu.poirier@linaro.org
In V5 you told me to review this again... I just did so at my tag stand.
Signed-off-by: Suzuki K Poulose suzuki.poulose@arm.com
Changes since v4:
- Refactor the "remove" callback for AMBA driver, for reuse by platform_driver to follow
.../coresight/coresight-etm4x-core.c | 62 ++++++++++++------- 1 file changed, 39 insertions(+), 23 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index f5bbb6131d77..228845f6fdd8 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -1708,14 +1708,11 @@ static void etm4_pm_clear(void) } } -static int etm4_probe(struct amba_device *adev, const struct amba_id *id) +static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid) { int ret;
- void __iomem *base;
- struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; struct etmv4_drvdata *drvdata;
- struct resource *res = &adev->res; struct coresight_desc desc = { 0 }; struct etm4_init_arg init_arg = { 0 };
@@ -1739,11 +1736,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up")) drvdata->skip_power_up = true;
- /* Validity for the resource is already checked by the AMBA core */
- base = devm_ioremap_resource(dev, res);
- if (IS_ERR(base))
return PTR_ERR(base);
- drvdata->base = base;
spin_lock_init(&drvdata->spinlock); @@ -1773,7 +1765,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) if (IS_ERR(pdata)) return PTR_ERR(pdata);
- adev->dev.platform_data = pdata;
- dev->platform_data = pdata;
desc.type = CORESIGHT_DEV_TYPE_SOURCE; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; @@ -1793,7 +1785,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) etmdrvdata[drvdata->cpu] = drvdata;
- pm_runtime_put(&adev->dev); dev_info(&drvdata->csdev->dev, "CPU%d: ETM v%d.%d initialized\n", drvdata->cpu, ETM_ARCH_MAJOR_VERSION(drvdata->arch), ETM_ARCH_MINOR_VERSION(drvdata->arch));
@@ -1803,11 +1794,30 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) drvdata->boot_enable = true; }
- etm4_check_arch_features(drvdata, id->id);
- etm4_check_arch_features(drvdata, etm_pid);
return 0; } +static int etm4_probe_amba(struct amba_device *adev, const struct amba_id *id) +{
- void __iomem *base;
- struct device *dev = &adev->dev;
- struct resource *res = &adev->res;
- int ret;
- /* Validity for the resource is already checked by the AMBA core */
- base = devm_ioremap_resource(dev, res);
- if (IS_ERR(base))
return PTR_ERR(base);
- ret = etm4_probe(dev, base, id->id);
- if (!ret)
pm_runtime_put(&adev->dev);
- return ret;
+}
static struct amba_cs_uci_id uci_id_etm4[] = { { /* ETMv4 UCI data */ @@ -1824,15 +1834,12 @@ static void clear_etmdrvdata(void *info) etmdrvdata[cpu] = NULL; } -static int etm4_remove(struct amba_device *adev) +static int __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) {
- struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev);
- etm_perf_symlink(drvdata->csdev, false);
- /*
* Taking hotplug lock here to avoid racing between etm4_remove and
* CPU hotplug call backs.
* Taking hotplug lock here to avoid racing between etm4_remove_dev()
*/ cpus_read_lock(); /** and CPU hotplug call backs.
@@ -1851,6 +1858,15 @@ static int etm4_remove(struct amba_device *adev) return 0; } +static int __exit etm4_remove_amba(struct amba_device *adev) +{
- struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev);
- if (drvdata)
return etm4_remove_dev(drvdata);
- return 0;
+}
static const struct amba_id etm4_ids[] = { CS_AMBA_ID(0x000bb95d), /* Cortex-A53 */ CS_AMBA_ID(0x000bb95e), /* Cortex-A57 */ @@ -1872,14 +1888,14 @@ static const struct amba_id etm4_ids[] = { MODULE_DEVICE_TABLE(amba, etm4_ids); -static struct amba_driver etm4x_driver = { +static struct amba_driver etm4x_amba_driver = { .drv = { .name = "coresight-etm4x", .owner = THIS_MODULE, .suppress_bind_attrs = true, },
- .probe = etm4_probe,
- .remove = etm4_remove,
- .probe = etm4_probe_amba,
- .remove = etm4_remove_amba, .id_table = etm4_ids,
}; @@ -1893,7 +1909,7 @@ static int __init etm4x_init(void) if (ret) return ret;
- ret = amba_driver_register(&etm4x_driver);
- ret = amba_driver_register(&etm4x_amba_driver); if (ret) { pr_err("Error registering etm4x driver\n"); etm4_pm_clear();
@@ -1904,7 +1920,7 @@ static int __init etm4x_init(void) static void __exit etm4x_exit(void) {
- amba_driver_unregister(&etm4x_driver);
- amba_driver_unregister(&etm4x_amba_driver); etm4_pm_clear();
} -- 2.24.1