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

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

Merge "coresight: support etm tracing on remote processors"

parents e77f7e1e 0f610611
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -22,10 +22,24 @@ Required properties:
	"arm,coresight-cti" for coresight cti devices,
	"qcom,coresight-hwevent" for coresight hardware event devices
	"arm,coresight-fuse" for coresight fuse device,
- reg : physical base address and length of the register set(s) of the component
- reg-names : names corresponding to each reg property value. The reg-names that
	need to be used with corresponding compatible string for a coresight device
	are:
	"qcom,coresight-audio-etm" for coresight audio etm trace device,
	"qcom,coresight-modem-etm" for coresight modem etm trace device,
	"qcom,coresight-wcn-etm" for coresight wireless etm trace device,
	"qcom,coresight-rpm-etm" for coresight rpm etm trace device
- reg : physical base address and length of the register set(s) of the component.
	Not required for the following compatible strings:
	- "qcom,coresight-audio-etm",
	- "qcom,coresight-modem-etm",
	- "qcom,coresight-wcn-etm",
	- "qcom,coresight-rpm-etm"
- reg-names : names corresponding to each reg property value.
	Not required for the following compatible strings:
	- "qcom,coresight-audio-etm",
	- "qcom,coresight-modem-etm",
	- "qcom,coresight-wcn-etm",
	- "qcom,coresight-rpm-etm"
	The reg-names that need to be used with corresponding compatible string
	for a coresight device are:
	- for coresight tmc-etr or tmc-etf device:
		compatible : should be "arm,coresight-tmc"
		reg-names  : should be:
+32 −0
Original line number Diff line number Diff line
@@ -151,6 +151,38 @@ config CORESIGHT_ETM_PCSAVE_DEFAULT_ENABLE

	  If unsure, say 'N' here to avoid potential power penalty.

config CORESIGHT_AUDIO_ETM
	bool "Audio processor ETM trace support"
	help
	  Enables support for ETM trace collection on audio processor using
	  CoreSight framework. Enabling this will allow turning on ETM tracing
	  on audio processor via sysfs by configuring the required CoreSight
	  components.

config CORESIGHT_MODEM_ETM
	bool "Modem processor ETM trace support"
	help
	  Enables support for ETM trace collection on modem processor using
	  CoreSight framework. Enabling this will allow turning on ETM tracing
	  on modem processor via sysfs by configuring the required CoreSight
	  components.

config CORESIGHT_WCN_ETM
	bool "Wireless subsystem processor ETM trace support"
	help
	  Enables support for ETM trace collection on wireless subsystem
	  processor  using CoreSight framework. Enabling this will allow
	  turning on ETM tracing on wireless subsystem via sysfs by configuring
	  the required CoreSight components.

config CORESIGHT_RPM_ETM
	bool "RPM processor ETM trace support"
	help
	  Enables support for ETM trace collection on RPM processor using
	  CoreSight framework. Enabling this will allow turning on ETM
	  tracing on RPM processor via sysfs by configuring the required
	  CoreSight components.

endif

config CORESIGHT_EVENT
+4 −0
Original line number Diff line number Diff line
@@ -13,4 +13,8 @@ obj-$(CONFIG_CORESIGHT_REPLICATOR) += coresight-replicator.o
obj-$(CONFIG_CORESIGHT_STM) += coresight-stm.o
obj-$(CONFIG_CORESIGHT_HWEVENT) += coresight-hwevent.o
obj-$(CONFIG_CORESIGHT_ETM) += coresight-etm.o coresight-etm-cp14.o
obj-$(CONFIG_CORESIGHT_AUDIO_ETM) += coresight-audio-etm.o
obj-$(CONFIG_CORESIGHT_MODEM_ETM) += coresight-modem-etm.o
obj-$(CONFIG_CORESIGHT_WCN_ETM) += coresight-wcn-etm.o
obj-$(CONFIG_CORESIGHT_RPM_ETM) += coresight-rpm-etm.o
obj-$(CONFIG_CORESIGHT_EVENT) += coresight-event.o
+132 −0
Original line number Diff line number Diff line
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
#include <linux/sysfs.h>
#include <linux/of_coresight.h>
#include <linux/coresight.h>

struct audio_etm_drvdata {
	struct device			*dev;
	struct coresight_device		*csdev;
};

static int audio_etm_enable(struct coresight_device *csdev)
{
	struct audio_etm_drvdata *drvdata =
		dev_get_drvdata(csdev->dev.parent);

	dev_info(drvdata->dev, "Audio ETM tracing enabled\n");
	return 0;
}


static void audio_etm_disable(struct coresight_device *csdev)
{
	struct audio_etm_drvdata *drvdata =
		dev_get_drvdata(csdev->dev.parent);

	dev_info(drvdata->dev, "Audio ETM tracing disabled\n");
}

static const struct coresight_ops_source audio_etm_source_ops = {
	.enable		= audio_etm_enable,
	.disable	= audio_etm_disable,
};

static const struct coresight_ops audio_cs_ops = {
	.source_ops	= &audio_etm_source_ops,
};

static int audio_etm_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct coresight_platform_data *pdata;
	struct audio_etm_drvdata *drvdata;
	struct coresight_desc *desc;

	if (pdev->dev.of_node) {
		pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
		if (IS_ERR(pdata))
			return PTR_ERR(pdata);
		pdev->dev.platform_data = pdata;
	}

	drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
	if (!drvdata)
		return -ENOMEM;

	drvdata->dev = &pdev->dev;
	platform_set_drvdata(pdev, drvdata);

	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
	if (!desc)
		return -ENOMEM;

	desc->type = CORESIGHT_DEV_TYPE_SOURCE;
	desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
	desc->ops = &audio_cs_ops;
	desc->pdata = pdev->dev.platform_data;
	desc->dev = &pdev->dev;
	desc->owner = THIS_MODULE;
	drvdata->csdev = coresight_register(desc);
	if (IS_ERR(drvdata->csdev))
		return PTR_ERR(drvdata->csdev);

	dev_info(dev, "Audio ETM initialized\n");
	return 0;
}

static int audio_etm_remove(struct platform_device *pdev)
{
	struct audio_etm_drvdata *drvdata = platform_get_drvdata(pdev);

	coresight_unregister(drvdata->csdev);
	return 0;
}

static struct of_device_id audio_etm_match[] = {
	{.compatible = "qcom,coresight-audio-etm"},
	{}
};

static struct platform_driver audio_etm_driver = {
	.probe          = audio_etm_probe,
	.remove         = audio_etm_remove,
	.driver         = {
		.name   = "coresight-audio-etm",
		.owner	= THIS_MODULE,
		.of_match_table = audio_etm_match,
	},
};

int __init audio_etm_init(void)
{
	return platform_driver_register(&audio_etm_driver);
}
module_init(audio_etm_init);

void __exit audio_etm_exit(void)
{
	platform_driver_unregister(&audio_etm_driver);
}
module_exit(audio_etm_exit);

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("CoreSight Audio ETM driver");
+132 −0
Original line number Diff line number Diff line
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
#include <linux/sysfs.h>
#include <linux/of_coresight.h>
#include <linux/coresight.h>

struct modem_etm_drvdata {
	struct device			*dev;
	struct coresight_device		*csdev;
};

static int modem_etm_enable(struct coresight_device *csdev)
{
	struct modem_etm_drvdata *drvdata =
		dev_get_drvdata(csdev->dev.parent);

	dev_info(drvdata->dev, "Modem ETM tracing enabled\n");
	return 0;
}


static void modem_etm_disable(struct coresight_device *csdev)
{
	struct modem_etm_drvdata *drvdata =
		dev_get_drvdata(csdev->dev.parent);

	dev_info(drvdata->dev, "Modem ETM tracing disabled\n");
}

static const struct coresight_ops_source modem_etm_source_ops = {
	.enable		= modem_etm_enable,
	.disable	= modem_etm_disable,
};

static const struct coresight_ops modem_cs_ops = {
	.source_ops	= &modem_etm_source_ops,
};

static int modem_etm_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct coresight_platform_data *pdata;
	struct modem_etm_drvdata *drvdata;
	struct coresight_desc *desc;

	if (pdev->dev.of_node) {
		pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
		if (IS_ERR(pdata))
			return PTR_ERR(pdata);
		pdev->dev.platform_data = pdata;
	}

	drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
	if (!drvdata)
		return -ENOMEM;

	drvdata->dev = &pdev->dev;
	platform_set_drvdata(pdev, drvdata);

	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
	if (!desc)
		return -ENOMEM;

	desc->type = CORESIGHT_DEV_TYPE_SOURCE;
	desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
	desc->ops = &modem_cs_ops;
	desc->pdata = pdev->dev.platform_data;
	desc->dev = &pdev->dev;
	desc->owner = THIS_MODULE;
	drvdata->csdev = coresight_register(desc);
	if (IS_ERR(drvdata->csdev))
		return  PTR_ERR(drvdata->csdev);

	dev_info(dev, "Modem ETM initialized\n");
	return 0;
}

static int modem_etm_remove(struct platform_device *pdev)
{
	struct modem_etm_drvdata *drvdata = platform_get_drvdata(pdev);

	coresight_unregister(drvdata->csdev);
	return 0;
}

static struct of_device_id modem_etm_match[] = {
	{.compatible = "qcom,coresight-modem-etm"},
	{}
};

static struct platform_driver modem_etm_driver = {
	.probe          = modem_etm_probe,
	.remove         = modem_etm_remove,
	.driver         = {
		.name   = "coresight-modem-etm",
		.owner	= THIS_MODULE,
		.of_match_table = modem_etm_match,
	},
};

int __init modem_etm_init(void)
{
	return platform_driver_register(&modem_etm_driver);
}
module_init(modem_etm_init);

void __exit modem_etm_exit(void)
{
	platform_driver_unregister(&modem_etm_driver);
}
module_exit(modem_etm_exit);

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("CoreSight Modem ETM driver");
Loading