* [PATCH v4 1/3] dt-bindings: arm: document the static TPDM compatible
2025-10-28 10:11 [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
@ 2025-10-28 10:11 ` Jie Gan
2025-10-28 10:11 ` [PATCH v4 2/3] coresight: tpdm: add static tpdm support Jie Gan
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Jie Gan @ 2025-10-28 10:11 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel, Jie Gan
The static TPDM device is intended for sources that do not require MMIO
mapping. Its compatible string should be documented clearly, along with
an example illustrating how to define a static TPDM node in the DT.
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
.../bindings/arm/qcom,coresight-tpdm.yaml | 23 +++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml
index 4edc47483851..c349306f0d52 100644
--- a/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml
+++ b/Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml
@@ -36,9 +36,12 @@ properties:
$nodename:
pattern: "^tpdm(@[0-9a-f]+)$"
compatible:
- items:
- - const: qcom,coresight-tpdm
- - const: arm,primecell
+ oneOf:
+ - items:
+ - const: qcom,coresight-static-tpdm
+ - items:
+ - const: qcom,coresight-tpdm
+ - const: arm,primecell
reg:
maxItems: 1
@@ -147,4 +150,18 @@ examples:
};
};
};
+
+ turing-llm-tpdm {
+ compatible = "qcom,coresight-static-tpdm";
+
+ qcom,cmb-element-bits = <32>;
+
+ out-ports {
+ port {
+ turing_llm_tpdm_out: endpoint {
+ remote-endpoint = <&turing0_funnel_in1>;
+ };
+ };
+ };
+ };
...
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH v4 2/3] coresight: tpdm: add static tpdm support
2025-10-28 10:11 [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
2025-10-28 10:11 ` [PATCH v4 1/3] dt-bindings: arm: document the static TPDM compatible Jie Gan
@ 2025-10-28 10:11 ` Jie Gan
2025-11-06 13:22 ` Suzuki K Poulose
2025-10-28 10:11 ` [PATCH v4 3/3] arm64: dts: qcom: lemans: enable static TPDM Jie Gan
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Jie Gan @ 2025-10-28 10:11 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel, Jie Gan
The static TPDM function as a dummy source, however, it is essential
to enable the port connected to the TPDA and configure the element size.
Without this, the TPDA cannot correctly receive trace data from the
static TPDM. Since the static TPDM does not require MMIO mapping to
access its registers, a clock controller is not mandatory for its
operation.
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
drivers/hwtracing/coresight/coresight-tpda.c | 7 --
drivers/hwtracing/coresight/coresight-tpdm.c | 174 ++++++++++++++++++++++-----
drivers/hwtracing/coresight/coresight-tpdm.h | 12 ++
3 files changed, 154 insertions(+), 39 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c
index 333b3cb23685..3a3825d27f86 100644
--- a/drivers/hwtracing/coresight/coresight-tpda.c
+++ b/drivers/hwtracing/coresight/coresight-tpda.c
@@ -22,13 +22,6 @@
DEFINE_CORESIGHT_DEVLIST(tpda_devs, "tpda");
-static bool coresight_device_is_tpdm(struct coresight_device *csdev)
-{
- return (coresight_is_device_source(csdev)) &&
- (csdev->subtype.source_subtype ==
- CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
-}
-
static void tpda_clear_element_size(struct coresight_device *csdev)
{
struct tpda_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
index 7214e65097ec..0e3896c12f07 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.c
+++ b/drivers/hwtracing/coresight/coresight-tpdm.c
@@ -470,6 +470,9 @@ static void tpdm_enable_cmb(struct tpdm_drvdata *drvdata)
*/
static void __tpdm_enable(struct tpdm_drvdata *drvdata)
{
+ if (coresight_is_static_tpdm(drvdata->csdev))
+ return;
+
CS_UNLOCK(drvdata->base);
tpdm_enable_dsb(drvdata);
@@ -532,6 +535,9 @@ static void tpdm_disable_cmb(struct tpdm_drvdata *drvdata)
/* TPDM disable operations */
static void __tpdm_disable(struct tpdm_drvdata *drvdata)
{
+ if (coresight_is_static_tpdm(drvdata->csdev))
+ return;
+
CS_UNLOCK(drvdata->base);
tpdm_disable_dsb(drvdata);
@@ -595,6 +601,30 @@ static int tpdm_datasets_setup(struct tpdm_drvdata *drvdata)
return 0;
}
+static int static_tpdm_datasets_setup(struct tpdm_drvdata *drvdata, struct device *dev)
+{
+ /* setup datasets for static TPDM */
+ if (fwnode_property_present(dev->fwnode, "qcom,dsb-element-bits") &&
+ (!drvdata->dsb)) {
+ drvdata->dsb = devm_kzalloc(drvdata->dev,
+ sizeof(*drvdata->dsb), GFP_KERNEL);
+
+ if (!drvdata->dsb)
+ return -ENOMEM;
+ }
+
+ if (fwnode_property_present(dev->fwnode, "qcom,cmb-element-bits") &&
+ (!drvdata->cmb)) {
+ drvdata->cmb = devm_kzalloc(drvdata->dev,
+ sizeof(*drvdata->cmb), GFP_KERNEL);
+
+ if (!drvdata->cmb)
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
static ssize_t reset_dataset_store(struct device *dev,
struct device_attribute *attr,
const char *buf,
@@ -1342,10 +1372,9 @@ static const struct attribute_group *tpdm_attr_grps[] = {
NULL,
};
-static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
+static int tpdm_probe(struct device *dev, struct resource *res)
{
void __iomem *base;
- struct device *dev = &adev->dev;
struct coresight_platform_data *pdata;
struct tpdm_drvdata *drvdata;
struct coresight_desc desc = { 0 };
@@ -1354,32 +1383,37 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
pdata = coresight_get_platform_data(dev);
if (IS_ERR(pdata))
return PTR_ERR(pdata);
- adev->dev.platform_data = pdata;
+ dev->platform_data = pdata;
/* driver data*/
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
if (!drvdata)
return -ENOMEM;
- drvdata->dev = &adev->dev;
+ drvdata->dev = dev;
dev_set_drvdata(dev, drvdata);
- base = devm_ioremap_resource(dev, &adev->res);
- if (IS_ERR(base))
- return PTR_ERR(base);
+ if (res) {
+ base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
- drvdata->base = base;
+ drvdata->base = base;
+ ret = tpdm_datasets_setup(drvdata);
+ if (ret)
+ return ret;
- ret = tpdm_datasets_setup(drvdata);
- if (ret)
- return ret;
-
- if (drvdata && tpdm_has_dsb_dataset(drvdata))
- of_property_read_u32(drvdata->dev->of_node,
- "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
+ if (drvdata && tpdm_has_dsb_dataset(drvdata))
+ of_property_read_u32(drvdata->dev->of_node,
+ "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
- if (drvdata && tpdm_has_cmb_dataset(drvdata))
- of_property_read_u32(drvdata->dev->of_node,
- "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
+ if (drvdata && tpdm_has_cmb_dataset(drvdata))
+ of_property_read_u32(drvdata->dev->of_node,
+ "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
+ } else {
+ ret = static_tpdm_datasets_setup(drvdata, dev);
+ if (ret)
+ return ret;
+ }
/* Set up coresight component description */
desc.name = coresight_alloc_device_name(&tpdm_devs, dev);
@@ -1388,34 +1422,51 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
desc.type = CORESIGHT_DEV_TYPE_SOURCE;
desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM;
desc.ops = &tpdm_cs_ops;
- desc.pdata = adev->dev.platform_data;
- desc.dev = &adev->dev;
+ desc.pdata = dev->platform_data;
+ desc.dev = dev;
desc.access = CSDEV_ACCESS_IOMEM(base);
- desc.groups = tpdm_attr_grps;
+ if (res)
+ desc.groups = tpdm_attr_grps;
drvdata->csdev = coresight_register(&desc);
if (IS_ERR(drvdata->csdev))
return PTR_ERR(drvdata->csdev);
spin_lock_init(&drvdata->spinlock);
- /* Decrease pm refcount when probe is done.*/
- pm_runtime_put(&adev->dev);
-
return 0;
}
-static void tpdm_remove(struct amba_device *adev)
+static int tpdm_remove(struct device *dev)
{
- struct tpdm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
+ struct tpdm_drvdata *drvdata = dev_get_drvdata(dev);
coresight_unregister(drvdata->csdev);
+
+ return 0;
+}
+
+static int dynamic_tpdm_probe(struct amba_device *adev,
+ const struct amba_id *id)
+{
+ int ret;
+
+ ret = tpdm_probe(&adev->dev, &adev->res);
+ if (!ret)
+ pm_runtime_put(&adev->dev);
+
+ return ret;
+}
+
+static void dynamic_tpdm_remove(struct amba_device *adev)
+{
+ tpdm_remove(&adev->dev);
}
/*
* Different TPDM has different periph id.
* The difference is 0-7 bits' value. So ignore 0-7 bits.
*/
-static const struct amba_id tpdm_ids[] = {
+static const struct amba_id dynamic_tpdm_ids[] = {
{
.id = 0x001f0e00,
.mask = 0x00ffff00,
@@ -1423,17 +1474,76 @@ static const struct amba_id tpdm_ids[] = {
{ 0, 0, NULL },
};
-static struct amba_driver tpdm_driver = {
+MODULE_DEVICE_TABLE(amba, dynamic_tpdm_ids);
+
+static struct amba_driver dynamic_tpdm_driver = {
.drv = {
.name = "coresight-tpdm",
.suppress_bind_attrs = true,
},
- .probe = tpdm_probe,
- .id_table = tpdm_ids,
- .remove = tpdm_remove,
+ .probe = dynamic_tpdm_probe,
+ .id_table = dynamic_tpdm_ids,
+ .remove = dynamic_tpdm_remove,
};
-module_amba_driver(tpdm_driver);
+static int tpdm_platform_probe(struct platform_device *pdev)
+{
+ struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ int ret;
+
+ pm_runtime_get_noresume(&pdev->dev);
+ pm_runtime_set_active(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+
+ ret = tpdm_probe(&pdev->dev, res);
+ pm_runtime_put(&pdev->dev);
+ if (ret)
+ pm_runtime_disable(&pdev->dev);
+
+ return ret;
+}
+
+static void tpdm_platform_remove(struct platform_device *pdev)
+{
+ struct tpdm_drvdata *drvdata = dev_get_drvdata(&pdev->dev);
+
+ if (WARN_ON(!drvdata))
+ return;
+
+ tpdm_remove(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+}
+
+static const struct of_device_id static_tpdm_match[] = {
+ {.compatible = "qcom,coresight-static-tpdm"},
+ {}
+};
+
+MODULE_DEVICE_TABLE(of, static_tpdm_match);
+
+static struct platform_driver static_tpdm_driver = {
+ .probe = tpdm_platform_probe,
+ .remove = tpdm_platform_remove,
+ .driver = {
+ .name = "coresight-static-tpdm",
+ .of_match_table = static_tpdm_match,
+ .suppress_bind_attrs = true,
+ },
+};
+
+static int __init tpdm_init(void)
+{
+ return coresight_init_driver("tpdm", &dynamic_tpdm_driver, &static_tpdm_driver,
+ THIS_MODULE);
+}
+
+static void __exit tpdm_exit(void)
+{
+ coresight_remove_driver(&dynamic_tpdm_driver, &static_tpdm_driver);
+}
+
+module_init(tpdm_init);
+module_exit(tpdm_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Trace, Profiling & Diagnostic Monitor driver");
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h
index b11754389734..2867f3ab8186 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.h
+++ b/drivers/hwtracing/coresight/coresight-tpdm.h
@@ -343,4 +343,16 @@ struct tpdm_dataset_attribute {
enum dataset_mem mem;
u32 idx;
};
+
+static inline bool coresight_device_is_tpdm(struct coresight_device *csdev)
+{
+ return (coresight_is_device_source(csdev)) &&
+ (csdev->subtype.source_subtype ==
+ CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
+}
+
+static inline bool coresight_is_static_tpdm(struct coresight_device *csdev)
+{
+ return (coresight_device_is_tpdm(csdev) && !csdev->access.base);
+}
#endif /* _CORESIGHT_CORESIGHT_TPDM_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v4 2/3] coresight: tpdm: add static tpdm support
2025-10-28 10:11 ` [PATCH v4 2/3] coresight: tpdm: add static tpdm support Jie Gan
@ 2025-11-06 13:22 ` Suzuki K Poulose
2025-11-07 1:57 ` Jie Gan
0 siblings, 1 reply; 9+ messages in thread
From: Suzuki K Poulose @ 2025-11-06 13:22 UTC (permalink / raw)
To: Jie Gan, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel
On 28/10/2025 10:11, Jie Gan wrote:
> The static TPDM function as a dummy source, however, it is essential
> to enable the port connected to the TPDA and configure the element size.
> Without this, the TPDA cannot correctly receive trace data from the
> static TPDM. Since the static TPDM does not require MMIO mapping to
> access its registers, a clock controller is not mandatory for its
> operation.
>
> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
> ---
> drivers/hwtracing/coresight/coresight-tpda.c | 7 --
> drivers/hwtracing/coresight/coresight-tpdm.c | 174 ++++++++++++++++++++++-----
> drivers/hwtracing/coresight/coresight-tpdm.h | 12 ++
> 3 files changed, 154 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c
> index 333b3cb23685..3a3825d27f86 100644
> --- a/drivers/hwtracing/coresight/coresight-tpda.c
> +++ b/drivers/hwtracing/coresight/coresight-tpda.c
> @@ -22,13 +22,6 @@
>
> DEFINE_CORESIGHT_DEVLIST(tpda_devs, "tpda");
>
> -static bool coresight_device_is_tpdm(struct coresight_device *csdev)
> -{
> - return (coresight_is_device_source(csdev)) &&
> - (csdev->subtype.source_subtype ==
> - CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
> -}
> -
> static void tpda_clear_element_size(struct coresight_device *csdev)
> {
> struct tpda_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
> index 7214e65097ec..0e3896c12f07 100644
> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
> @@ -470,6 +470,9 @@ static void tpdm_enable_cmb(struct tpdm_drvdata *drvdata)
> */
> static void __tpdm_enable(struct tpdm_drvdata *drvdata)
> {
> + if (coresight_is_static_tpdm(drvdata->csdev))
> + return;
> +
> CS_UNLOCK(drvdata->base);
>
> tpdm_enable_dsb(drvdata);
> @@ -532,6 +535,9 @@ static void tpdm_disable_cmb(struct tpdm_drvdata *drvdata)
> /* TPDM disable operations */
> static void __tpdm_disable(struct tpdm_drvdata *drvdata)
> {
> + if (coresight_is_static_tpdm(drvdata->csdev))
> + return;
> +
> CS_UNLOCK(drvdata->base);
>
> tpdm_disable_dsb(drvdata);
> @@ -595,6 +601,30 @@ static int tpdm_datasets_setup(struct tpdm_drvdata *drvdata)
> return 0;
> }
>
> +static int static_tpdm_datasets_setup(struct tpdm_drvdata *drvdata, struct device *dev)
> +{
> + /* setup datasets for static TPDM */
> + if (fwnode_property_present(dev->fwnode, "qcom,dsb-element-bits") &&
> + (!drvdata->dsb)) {
> + drvdata->dsb = devm_kzalloc(drvdata->dev,
> + sizeof(*drvdata->dsb), GFP_KERNEL);
> +
> + if (!drvdata->dsb)
> + return -ENOMEM;
> + }
> +
> + if (fwnode_property_present(dev->fwnode, "qcom,cmb-element-bits") &&
> + (!drvdata->cmb)) {
> + drvdata->cmb = devm_kzalloc(drvdata->dev,
> + sizeof(*drvdata->cmb), GFP_KERNEL);
> +
> + if (!drvdata->cmb)
> + return -ENOMEM;
> + }
> +
> + return 0;
> +}
> +
> static ssize_t reset_dataset_store(struct device *dev,
> struct device_attribute *attr,
> const char *buf,
> @@ -1342,10 +1372,9 @@ static const struct attribute_group *tpdm_attr_grps[] = {
> NULL,
> };
>
> -static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
> +static int tpdm_probe(struct device *dev, struct resource *res)
> {
> void __iomem *base;
> - struct device *dev = &adev->dev;
> struct coresight_platform_data *pdata;
> struct tpdm_drvdata *drvdata;
> struct coresight_desc desc = { 0 };
> @@ -1354,32 +1383,37 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
> pdata = coresight_get_platform_data(dev);
> if (IS_ERR(pdata))
> return PTR_ERR(pdata);
> - adev->dev.platform_data = pdata;
> + dev->platform_data = pdata;
>
> /* driver data*/
> drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
> if (!drvdata)
> return -ENOMEM;
> - drvdata->dev = &adev->dev;
> + drvdata->dev = dev;
> dev_set_drvdata(dev, drvdata);
>
> - base = devm_ioremap_resource(dev, &adev->res);
> - if (IS_ERR(base))
> - return PTR_ERR(base);
> + if (res) {
> + base = devm_ioremap_resource(dev, res);
> + if (IS_ERR(base))
> + return PTR_ERR(base);
>
> - drvdata->base = base;
> + drvdata->base = base;
> + ret = tpdm_datasets_setup(drvdata);
> + if (ret)
> + return ret;
>
> - ret = tpdm_datasets_setup(drvdata);
> - if (ret)
> - return ret;
> -
> - if (drvdata && tpdm_has_dsb_dataset(drvdata))
> - of_property_read_u32(drvdata->dev->of_node,
> - "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
> + if (drvdata && tpdm_has_dsb_dataset(drvdata))
> + of_property_read_u32(drvdata->dev->of_node,
> + "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
>
> - if (drvdata && tpdm_has_cmb_dataset(drvdata))
> - of_property_read_u32(drvdata->dev->of_node,
> - "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
> + if (drvdata && tpdm_has_cmb_dataset(drvdata))
> + of_property_read_u32(drvdata->dev->of_node,
> + "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
minor nit: drvdata is guranteed to be !NULL, as we err out if
it was. This can be fixed up as separate patch.
Suzuki
> + } else {
> + ret = static_tpdm_datasets_setup(drvdata, dev);
> + if (ret)
> + return ret;
> + }
>
> /* Set up coresight component description */
> desc.name = coresight_alloc_device_name(&tpdm_devs, dev);
> @@ -1388,34 +1422,51 @@ static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
> desc.type = CORESIGHT_DEV_TYPE_SOURCE;
> desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM;
> desc.ops = &tpdm_cs_ops;
> - desc.pdata = adev->dev.platform_data;
> - desc.dev = &adev->dev;
> + desc.pdata = dev->platform_data;
> + desc.dev = dev;
> desc.access = CSDEV_ACCESS_IOMEM(base);
> - desc.groups = tpdm_attr_grps;
> + if (res)
> + desc.groups = tpdm_attr_grps;
> drvdata->csdev = coresight_register(&desc);
> if (IS_ERR(drvdata->csdev))
> return PTR_ERR(drvdata->csdev);
>
> spin_lock_init(&drvdata->spinlock);
>
> - /* Decrease pm refcount when probe is done.*/
> - pm_runtime_put(&adev->dev);
> -
> return 0;
> }
>
> -static void tpdm_remove(struct amba_device *adev)
> +static int tpdm_remove(struct device *dev)
> {
> - struct tpdm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev);
>
> coresight_unregister(drvdata->csdev);
> +
> + return 0;
> +}
> +
> +static int dynamic_tpdm_probe(struct amba_device *adev,
> + const struct amba_id *id)
> +{
> + int ret;
> +
> + ret = tpdm_probe(&adev->dev, &adev->res);
> + if (!ret)
> + pm_runtime_put(&adev->dev);
> +
> + return ret;
> +}
> +
> +static void dynamic_tpdm_remove(struct amba_device *adev)
> +{
> + tpdm_remove(&adev->dev);
> }
>
> /*
> * Different TPDM has different periph id.
> * The difference is 0-7 bits' value. So ignore 0-7 bits.
> */
> -static const struct amba_id tpdm_ids[] = {
> +static const struct amba_id dynamic_tpdm_ids[] = {
> {
> .id = 0x001f0e00,
> .mask = 0x00ffff00,
> @@ -1423,17 +1474,76 @@ static const struct amba_id tpdm_ids[] = {
> { 0, 0, NULL },
> };
>
> -static struct amba_driver tpdm_driver = {
> +MODULE_DEVICE_TABLE(amba, dynamic_tpdm_ids);
> +
> +static struct amba_driver dynamic_tpdm_driver = {
> .drv = {
> .name = "coresight-tpdm",
> .suppress_bind_attrs = true,
> },
> - .probe = tpdm_probe,
> - .id_table = tpdm_ids,
> - .remove = tpdm_remove,
> + .probe = dynamic_tpdm_probe,
> + .id_table = dynamic_tpdm_ids,
> + .remove = dynamic_tpdm_remove,
> };
>
> -module_amba_driver(tpdm_driver);
> +static int tpdm_platform_probe(struct platform_device *pdev)
> +{
> + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + int ret;
> +
> + pm_runtime_get_noresume(&pdev->dev);
> + pm_runtime_set_active(&pdev->dev);
> + pm_runtime_enable(&pdev->dev);
> +
> + ret = tpdm_probe(&pdev->dev, res);
> + pm_runtime_put(&pdev->dev);
> + if (ret)
> + pm_runtime_disable(&pdev->dev);
> +
> + return ret;
> +}
> +
> +static void tpdm_platform_remove(struct platform_device *pdev)
> +{
> + struct tpdm_drvdata *drvdata = dev_get_drvdata(&pdev->dev);
> +
> + if (WARN_ON(!drvdata))
> + return;
> +
> + tpdm_remove(&pdev->dev);
> + pm_runtime_disable(&pdev->dev);
> +}
> +
> +static const struct of_device_id static_tpdm_match[] = {
> + {.compatible = "qcom,coresight-static-tpdm"},
> + {}
> +};
> +
> +MODULE_DEVICE_TABLE(of, static_tpdm_match);
> +
> +static struct platform_driver static_tpdm_driver = {
> + .probe = tpdm_platform_probe,
> + .remove = tpdm_platform_remove,
> + .driver = {
> + .name = "coresight-static-tpdm",
> + .of_match_table = static_tpdm_match,
> + .suppress_bind_attrs = true,
> + },
> +};
> +
> +static int __init tpdm_init(void)
> +{
> + return coresight_init_driver("tpdm", &dynamic_tpdm_driver, &static_tpdm_driver,
> + THIS_MODULE);
> +}
> +
> +static void __exit tpdm_exit(void)
> +{
> + coresight_remove_driver(&dynamic_tpdm_driver, &static_tpdm_driver);
> +}
> +
> +module_init(tpdm_init);
> +module_exit(tpdm_exit);
>
> MODULE_LICENSE("GPL");
> MODULE_DESCRIPTION("Trace, Profiling & Diagnostic Monitor driver");
> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h
> index b11754389734..2867f3ab8186 100644
> --- a/drivers/hwtracing/coresight/coresight-tpdm.h
> +++ b/drivers/hwtracing/coresight/coresight-tpdm.h
> @@ -343,4 +343,16 @@ struct tpdm_dataset_attribute {
> enum dataset_mem mem;
> u32 idx;
> };
> +
> +static inline bool coresight_device_is_tpdm(struct coresight_device *csdev)
> +{
> + return (coresight_is_device_source(csdev)) &&
> + (csdev->subtype.source_subtype ==
> + CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
> +}
> +
> +static inline bool coresight_is_static_tpdm(struct coresight_device *csdev)
> +{
> + return (coresight_device_is_tpdm(csdev) && !csdev->access.base);
> +}
> #endif /* _CORESIGHT_CORESIGHT_TPDM_H */
>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v4 2/3] coresight: tpdm: add static tpdm support
2025-11-06 13:22 ` Suzuki K Poulose
@ 2025-11-07 1:57 ` Jie Gan
0 siblings, 0 replies; 9+ messages in thread
From: Jie Gan @ 2025-11-07 1:57 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel
On 11/6/2025 9:22 PM, Suzuki K Poulose wrote:
> On 28/10/2025 10:11, Jie Gan wrote:
>> The static TPDM function as a dummy source, however, it is essential
>> to enable the port connected to the TPDA and configure the element size.
>> Without this, the TPDA cannot correctly receive trace data from the
>> static TPDM. Since the static TPDM does not require MMIO mapping to
>> access its registers, a clock controller is not mandatory for its
>> operation.
>>
>> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
>> ---
>> drivers/hwtracing/coresight/coresight-tpda.c | 7 --
>> drivers/hwtracing/coresight/coresight-tpdm.c | 174 +++++++++++++++++
>> +++++-----
>> drivers/hwtracing/coresight/coresight-tpdm.h | 12 ++
>> 3 files changed, 154 insertions(+), 39 deletions(-)
>>
>> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/
>> hwtracing/coresight/coresight-tpda.c
>> index 333b3cb23685..3a3825d27f86 100644
>> --- a/drivers/hwtracing/coresight/coresight-tpda.c
>> +++ b/drivers/hwtracing/coresight/coresight-tpda.c
>> @@ -22,13 +22,6 @@
>> DEFINE_CORESIGHT_DEVLIST(tpda_devs, "tpda");
>> -static bool coresight_device_is_tpdm(struct coresight_device *csdev)
>> -{
>> - return (coresight_is_device_source(csdev)) &&
>> - (csdev->subtype.source_subtype ==
>> - CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
>> -}
>> -
>> static void tpda_clear_element_size(struct coresight_device *csdev)
>> {
>> struct tpda_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/
>> hwtracing/coresight/coresight-tpdm.c
>> index 7214e65097ec..0e3896c12f07 100644
>> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
>> @@ -470,6 +470,9 @@ static void tpdm_enable_cmb(struct tpdm_drvdata
>> *drvdata)
>> */
>> static void __tpdm_enable(struct tpdm_drvdata *drvdata)
>> {
>> + if (coresight_is_static_tpdm(drvdata->csdev))
>> + return;
>> +
>> CS_UNLOCK(drvdata->base);
>> tpdm_enable_dsb(drvdata);
>> @@ -532,6 +535,9 @@ static void tpdm_disable_cmb(struct tpdm_drvdata
>> *drvdata)
>> /* TPDM disable operations */
>> static void __tpdm_disable(struct tpdm_drvdata *drvdata)
>> {
>> + if (coresight_is_static_tpdm(drvdata->csdev))
>> + return;
>> +
>> CS_UNLOCK(drvdata->base);
>> tpdm_disable_dsb(drvdata);
>> @@ -595,6 +601,30 @@ static int tpdm_datasets_setup(struct
>> tpdm_drvdata *drvdata)
>> return 0;
>> }
>> +static int static_tpdm_datasets_setup(struct tpdm_drvdata *drvdata,
>> struct device *dev)
>> +{
>> + /* setup datasets for static TPDM */
>> + if (fwnode_property_present(dev->fwnode, "qcom,dsb-element-bits") &&
>> + (!drvdata->dsb)) {
>> + drvdata->dsb = devm_kzalloc(drvdata->dev,
>> + sizeof(*drvdata->dsb), GFP_KERNEL);
>> +
>> + if (!drvdata->dsb)
>> + return -ENOMEM;
>> + }
>> +
>> + if (fwnode_property_present(dev->fwnode, "qcom,cmb-element-bits") &&
>> + (!drvdata->cmb)) {
>> + drvdata->cmb = devm_kzalloc(drvdata->dev,
>> + sizeof(*drvdata->cmb), GFP_KERNEL);
>> +
>> + if (!drvdata->cmb)
>> + return -ENOMEM;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> static ssize_t reset_dataset_store(struct device *dev,
>> struct device_attribute *attr,
>> const char *buf,
>> @@ -1342,10 +1372,9 @@ static const struct attribute_group
>> *tpdm_attr_grps[] = {
>> NULL,
>> };
>> -static int tpdm_probe(struct amba_device *adev, const struct amba_id
>> *id)
>> +static int tpdm_probe(struct device *dev, struct resource *res)
>> {
>> void __iomem *base;
>> - struct device *dev = &adev->dev;
>> struct coresight_platform_data *pdata;
>> struct tpdm_drvdata *drvdata;
>> struct coresight_desc desc = { 0 };
>> @@ -1354,32 +1383,37 @@ static int tpdm_probe(struct amba_device
>> *adev, const struct amba_id *id)
>> pdata = coresight_get_platform_data(dev);
>> if (IS_ERR(pdata))
>> return PTR_ERR(pdata);
>> - adev->dev.platform_data = pdata;
>> + dev->platform_data = pdata;
>> /* driver data*/
>> drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
>> if (!drvdata)
>> return -ENOMEM;
>> - drvdata->dev = &adev->dev;
>> + drvdata->dev = dev;
>> dev_set_drvdata(dev, drvdata);
>> - base = devm_ioremap_resource(dev, &adev->res);
>> - if (IS_ERR(base))
>> - return PTR_ERR(base);
>> + if (res) {
>> + base = devm_ioremap_resource(dev, res);
>> + if (IS_ERR(base))
>> + return PTR_ERR(base);
>> - drvdata->base = base;
>> + drvdata->base = base;
>> + ret = tpdm_datasets_setup(drvdata);
>> + if (ret)
>> + return ret;
>> - ret = tpdm_datasets_setup(drvdata);
>> - if (ret)
>> - return ret;
>> -
>> - if (drvdata && tpdm_has_dsb_dataset(drvdata))
>> - of_property_read_u32(drvdata->dev->of_node,
>> - "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
>> + if (drvdata && tpdm_has_dsb_dataset(drvdata))
>> + of_property_read_u32(drvdata->dev->of_node,
>> + "qcom,dsb-msrs-num", &drvdata->dsb_msr_num);
>> - if (drvdata && tpdm_has_cmb_dataset(drvdata))
>> - of_property_read_u32(drvdata->dev->of_node,
>> - "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
>> + if (drvdata && tpdm_has_cmb_dataset(drvdata))
>> + of_property_read_u32(drvdata->dev->of_node,
>> + "qcom,cmb-msrs-num", &drvdata->cmb_msr_num);
>
> minor nit: drvdata is guranteed to be !NULL, as we err out if
> it was. This can be fixed up as separate patch.
Acked. We dont need check the drvdata here and it has been gurranted to
be !NULL. Will fix it with separate patch.
Thanks,
Jie
>
> Suzuki
>
>
>
>> + } else {
>> + ret = static_tpdm_datasets_setup(drvdata, dev);
>> + if (ret)
>> + return ret;
>> + }
>> /* Set up coresight component description */
>> desc.name = coresight_alloc_device_name(&tpdm_devs, dev);
>> @@ -1388,34 +1422,51 @@ static int tpdm_probe(struct amba_device
>> *adev, const struct amba_id *id)
>> desc.type = CORESIGHT_DEV_TYPE_SOURCE;
>> desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM;
>> desc.ops = &tpdm_cs_ops;
>> - desc.pdata = adev->dev.platform_data;
>> - desc.dev = &adev->dev;
>> + desc.pdata = dev->platform_data;
>> + desc.dev = dev;
>> desc.access = CSDEV_ACCESS_IOMEM(base);
>> - desc.groups = tpdm_attr_grps;
>> + if (res)
>> + desc.groups = tpdm_attr_grps;
>> drvdata->csdev = coresight_register(&desc);
>> if (IS_ERR(drvdata->csdev))
>> return PTR_ERR(drvdata->csdev);
>> spin_lock_init(&drvdata->spinlock);
>> - /* Decrease pm refcount when probe is done.*/
>> - pm_runtime_put(&adev->dev);
>> -
>> return 0;
>> }
>> -static void tpdm_remove(struct amba_device *adev)
>> +static int tpdm_remove(struct device *dev)
>> {
>> - struct tpdm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev);
>> coresight_unregister(drvdata->csdev);
>> +
>> + return 0;
>> +}
>> +
>> +static int dynamic_tpdm_probe(struct amba_device *adev,
>> + const struct amba_id *id)
>> +{
>> + int ret;
>> +
>> + ret = tpdm_probe(&adev->dev, &adev->res);
>> + if (!ret)
>> + pm_runtime_put(&adev->dev);
>> +
>> + return ret;
>> +}
>> +
>> +static void dynamic_tpdm_remove(struct amba_device *adev)
>> +{
>> + tpdm_remove(&adev->dev);
>> }
>> /*
>> * Different TPDM has different periph id.
>> * The difference is 0-7 bits' value. So ignore 0-7 bits.
>> */
>> -static const struct amba_id tpdm_ids[] = {
>> +static const struct amba_id dynamic_tpdm_ids[] = {
>> {
>> .id = 0x001f0e00,
>> .mask = 0x00ffff00,
>> @@ -1423,17 +1474,76 @@ static const struct amba_id tpdm_ids[] = {
>> { 0, 0, NULL },
>> };
>> -static struct amba_driver tpdm_driver = {
>> +MODULE_DEVICE_TABLE(amba, dynamic_tpdm_ids);
>> +
>> +static struct amba_driver dynamic_tpdm_driver = {
>> .drv = {
>> .name = "coresight-tpdm",
>> .suppress_bind_attrs = true,
>> },
>> - .probe = tpdm_probe,
>> - .id_table = tpdm_ids,
>> - .remove = tpdm_remove,
>> + .probe = dynamic_tpdm_probe,
>> + .id_table = dynamic_tpdm_ids,
>> + .remove = dynamic_tpdm_remove,
>> };
>> -module_amba_driver(tpdm_driver);
>> +static int tpdm_platform_probe(struct platform_device *pdev)
>> +{
>> + struct resource *res = platform_get_resource(pdev,
>> IORESOURCE_MEM, 0);
>> + int ret;
>> +
>> + pm_runtime_get_noresume(&pdev->dev);
>> + pm_runtime_set_active(&pdev->dev);
>> + pm_runtime_enable(&pdev->dev);
>> +
>> + ret = tpdm_probe(&pdev->dev, res);
>> + pm_runtime_put(&pdev->dev);
>> + if (ret)
>> + pm_runtime_disable(&pdev->dev);
>> +
>> + return ret;
>> +}
>> +
>> +static void tpdm_platform_remove(struct platform_device *pdev)
>> +{
>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(&pdev->dev);
>> +
>> + if (WARN_ON(!drvdata))
>> + return;
>> +
>> + tpdm_remove(&pdev->dev);
>> + pm_runtime_disable(&pdev->dev);
>> +}
>> +
>> +static const struct of_device_id static_tpdm_match[] = {
>> + {.compatible = "qcom,coresight-static-tpdm"},
>> + {}
>> +};
>> +
>> +MODULE_DEVICE_TABLE(of, static_tpdm_match);
>> +
>> +static struct platform_driver static_tpdm_driver = {
>> + .probe = tpdm_platform_probe,
>> + .remove = tpdm_platform_remove,
>> + .driver = {
>> + .name = "coresight-static-tpdm",
>> + .of_match_table = static_tpdm_match,
>> + .suppress_bind_attrs = true,
>> + },
>> +};
>> +
>> +static int __init tpdm_init(void)
>> +{
>> + return coresight_init_driver("tpdm", &dynamic_tpdm_driver,
>> &static_tpdm_driver,
>> + THIS_MODULE);
>> +}
>> +
>> +static void __exit tpdm_exit(void)
>> +{
>> + coresight_remove_driver(&dynamic_tpdm_driver, &static_tpdm_driver);
>> +}
>> +
>> +module_init(tpdm_init);
>> +module_exit(tpdm_exit);
>> MODULE_LICENSE("GPL");
>> MODULE_DESCRIPTION("Trace, Profiling & Diagnostic Monitor driver");
>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/
>> hwtracing/coresight/coresight-tpdm.h
>> index b11754389734..2867f3ab8186 100644
>> --- a/drivers/hwtracing/coresight/coresight-tpdm.h
>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.h
>> @@ -343,4 +343,16 @@ struct tpdm_dataset_attribute {
>> enum dataset_mem mem;
>> u32 idx;
>> };
>> +
>> +static inline bool coresight_device_is_tpdm(struct coresight_device
>> *csdev)
>> +{
>> + return (coresight_is_device_source(csdev)) &&
>> + (csdev->subtype.source_subtype ==
>> + CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM);
>> +}
>> +
>> +static inline bool coresight_is_static_tpdm(struct coresight_device
>> *csdev)
>> +{
>> + return (coresight_device_is_tpdm(csdev) && !csdev->access.base);
>> +}
>> #endif /* _CORESIGHT_CORESIGHT_TPDM_H */
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 3/3] arm64: dts: qcom: lemans: enable static TPDM
2025-10-28 10:11 [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
2025-10-28 10:11 ` [PATCH v4 1/3] dt-bindings: arm: document the static TPDM compatible Jie Gan
2025-10-28 10:11 ` [PATCH v4 2/3] coresight: tpdm: add static tpdm support Jie Gan
@ 2025-10-28 10:11 ` Jie Gan
2025-11-06 13:23 ` Suzuki K Poulose
2025-11-06 5:20 ` [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
2025-11-06 13:25 ` [subset] " Suzuki K Poulose
4 siblings, 1 reply; 9+ messages in thread
From: Jie Gan @ 2025-10-28 10:11 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel, Jie Gan, Konrad Dybcio
Enable static TPDM device for lemans.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/lemans.dtsi | 105 +++++++++++++++++++++++++++++++++++
1 file changed, 105 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/lemans.dtsi b/arch/arm64/boot/dts/qcom/lemans.dtsi
index 0b154d57ba24..8a93b353d11c 100644
--- a/arch/arm64/boot/dts/qcom/lemans.dtsi
+++ b/arch/arm64/boot/dts/qcom/lemans.dtsi
@@ -2961,6 +2961,14 @@ funnel1_in4: endpoint {
<&apss_funnel1_out>;
};
};
+
+ port@5 {
+ reg = <5>;
+
+ funnel1_in5: endpoint {
+ remote-endpoint = <&dlct0_funnel_out>;
+ };
+ };
};
};
@@ -3118,6 +3126,60 @@ etr1_out: endpoint {
};
};
+ tpda@4ad3000 {
+ compatible = "qcom,coresight-tpda", "arm,primecell";
+ reg = <0x0 0x4ad3000 0x0 0x1000>;
+
+ clocks = <&aoss_qmp>;
+ clock-names = "apb_pclk";
+
+ in-ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@10 {
+ reg = <16>;
+ dlct0_tpda_in16: endpoint {
+ remote-endpoint = <&turing0_funnel_out>;
+ };
+ };
+ };
+
+ out-ports {
+ port {
+ dlct0_tpda_out: endpoint {
+ remote-endpoint =
+ <&dlct0_funnel_in0>;
+ };
+ };
+ };
+
+ };
+
+ funnel@4ad4000 {
+ compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
+ reg = <0x0 0x4ad4000 0x0 0x1000>;
+
+ clocks = <&aoss_qmp>;
+ clock-names = "apb_pclk";
+
+ in-ports {
+ port {
+ dlct0_funnel_in0: endpoint {
+ remote-endpoint = <&dlct0_tpda_out>;
+ };
+ };
+ };
+
+ out-ports {
+ port {
+ dlct0_funnel_out: endpoint {
+ remote-endpoint = <&funnel1_in5>;
+ };
+ };
+ };
+ };
+
funnel@4b04000 {
compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
reg = <0x0 0x4b04000 0x0 0x1000>;
@@ -3390,6 +3452,35 @@ aoss_cti: cti@4b13000 {
clock-names = "apb_pclk";
};
+ funnel@4b83000 {
+ compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
+ reg = <0x0 0x4b83000 0x0 0x1000>;
+
+ clocks = <&aoss_qmp>;
+ clock-names = "apb_pclk";
+
+ in-ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@1 {
+ reg = <1>;
+
+ turing0_funnel_in1: endpoint {
+ remote-endpoint = <&turing_llm_tpdm_out>;
+ };
+ };
+ };
+
+ out-ports {
+ port {
+ turing0_funnel_out: endpoint {
+ remote-endpoint = <&dlct0_tpda_in16>;
+ };
+ };
+ };
+ };
+
etm@6040000 {
compatible = "arm,primecell";
reg = <0x0 0x6040000 0x0 0x1000>;
@@ -8269,6 +8360,20 @@ arch_timer: timer {
<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_LOW)>;
};
+ turing-llm-tpdm {
+ compatible = "qcom,coresight-static-tpdm";
+
+ qcom,cmb-element-bits = <32>;
+
+ out-ports {
+ port {
+ turing_llm_tpdm_out: endpoint {
+ remote-endpoint = <&turing0_funnel_in1>;
+ };
+ };
+ };
+ };
+
pcie0: pcie@1c00000 {
compatible = "qcom,pcie-sa8775p";
reg = <0x0 0x01c00000 0x0 0x3000>,
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v4 3/3] arm64: dts: qcom: lemans: enable static TPDM
2025-10-28 10:11 ` [PATCH v4 3/3] arm64: dts: qcom: lemans: enable static TPDM Jie Gan
@ 2025-11-06 13:23 ` Suzuki K Poulose
0 siblings, 0 replies; 9+ messages in thread
From: Suzuki K Poulose @ 2025-11-06 13:23 UTC (permalink / raw)
To: Jie Gan, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel, Konrad Dybcio
On 28/10/2025 10:11, Jie Gan wrote:
> Enable static TPDM device for lemans.
>
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
Assuming this goes via some other tree:
Acked-by: Suzuki K Poulose <suzuki.poulose@arm.com>
> ---
> arch/arm64/boot/dts/qcom/lemans.dtsi | 105 +++++++++++++++++++++++++++++++++++
> 1 file changed, 105 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/lemans.dtsi b/arch/arm64/boot/dts/qcom/lemans.dtsi
> index 0b154d57ba24..8a93b353d11c 100644
> --- a/arch/arm64/boot/dts/qcom/lemans.dtsi
> +++ b/arch/arm64/boot/dts/qcom/lemans.dtsi
> @@ -2961,6 +2961,14 @@ funnel1_in4: endpoint {
> <&apss_funnel1_out>;
> };
> };
> +
> + port@5 {
> + reg = <5>;
> +
> + funnel1_in5: endpoint {
> + remote-endpoint = <&dlct0_funnel_out>;
> + };
> + };
> };
> };
>
> @@ -3118,6 +3126,60 @@ etr1_out: endpoint {
> };
> };
>
> + tpda@4ad3000 {
> + compatible = "qcom,coresight-tpda", "arm,primecell";
> + reg = <0x0 0x4ad3000 0x0 0x1000>;
> +
> + clocks = <&aoss_qmp>;
> + clock-names = "apb_pclk";
> +
> + in-ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port@10 {
> + reg = <16>;
> + dlct0_tpda_in16: endpoint {
> + remote-endpoint = <&turing0_funnel_out>;
> + };
> + };
> + };
> +
> + out-ports {
> + port {
> + dlct0_tpda_out: endpoint {
> + remote-endpoint =
> + <&dlct0_funnel_in0>;
> + };
> + };
> + };
> +
> + };
> +
> + funnel@4ad4000 {
> + compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
> + reg = <0x0 0x4ad4000 0x0 0x1000>;
> +
> + clocks = <&aoss_qmp>;
> + clock-names = "apb_pclk";
> +
> + in-ports {
> + port {
> + dlct0_funnel_in0: endpoint {
> + remote-endpoint = <&dlct0_tpda_out>;
> + };
> + };
> + };
> +
> + out-ports {
> + port {
> + dlct0_funnel_out: endpoint {
> + remote-endpoint = <&funnel1_in5>;
> + };
> + };
> + };
> + };
> +
> funnel@4b04000 {
> compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
> reg = <0x0 0x4b04000 0x0 0x1000>;
> @@ -3390,6 +3452,35 @@ aoss_cti: cti@4b13000 {
> clock-names = "apb_pclk";
> };
>
> + funnel@4b83000 {
> + compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
> + reg = <0x0 0x4b83000 0x0 0x1000>;
> +
> + clocks = <&aoss_qmp>;
> + clock-names = "apb_pclk";
> +
> + in-ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port@1 {
> + reg = <1>;
> +
> + turing0_funnel_in1: endpoint {
> + remote-endpoint = <&turing_llm_tpdm_out>;
> + };
> + };
> + };
> +
> + out-ports {
> + port {
> + turing0_funnel_out: endpoint {
> + remote-endpoint = <&dlct0_tpda_in16>;
> + };
> + };
> + };
> + };
> +
> etm@6040000 {
> compatible = "arm,primecell";
> reg = <0x0 0x6040000 0x0 0x1000>;
> @@ -8269,6 +8360,20 @@ arch_timer: timer {
> <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_LOW)>;
> };
>
> + turing-llm-tpdm {
> + compatible = "qcom,coresight-static-tpdm";
> +
> + qcom,cmb-element-bits = <32>;
> +
> + out-ports {
> + port {
> + turing_llm_tpdm_out: endpoint {
> + remote-endpoint = <&turing0_funnel_in1>;
> + };
> + };
> + };
> + };
> +
> pcie0: pcie@1c00000 {
> compatible = "qcom,pcie-sa8775p";
> reg = <0x0 0x01c00000 0x0 0x3000>,
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/3] coresight: add static TPDM support
2025-10-28 10:11 [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
` (2 preceding siblings ...)
2025-10-28 10:11 ` [PATCH v4 3/3] arm64: dts: qcom: lemans: enable static TPDM Jie Gan
@ 2025-11-06 5:20 ` Jie Gan
2025-11-06 13:25 ` [subset] " Suzuki K Poulose
4 siblings, 0 replies; 9+ messages in thread
From: Jie Gan @ 2025-11-06 5:20 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Tingwei Zhang, Mao Jinlong,
Tao Zhang, Alexander Shishkin, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, coresight, linux-arm-kernel, devicetree,
linux-kernel, Konrad Dybcio
On 10/28/2025 6:11 PM, Jie Gan wrote:
> The static TPDM function as a dummy source, however, it is essential
> to enable the port connected to the TPDA and configure the element size.
> Without this, the TPDA cannot correctly receive trace data from the
> static TPDM. Since the static TPDM does not require MMIO mapping to
> access its registers, a clock controller is not mandatory for its
> operation.
>
> Meanwhile, a function has been introduced to determine whether the
> current csdev is a static TPDM. This check enables the TPDA device
> to correctly read the element size and activate its port accordingly.
> Otherwise the TPDA cannot receive the trace data from the TPDM device.
>
Gentle reminder.
> Changes in V4:
> 1. decouple from tpda driver code.
> 2. Introduce a new solution to identify static TPDM.
> Link to V3 - https://lore.kernel.org/all/20251013-add-static-tpdm-support-v3-0-a720b73e83db@oss.qualcomm.com/
>
> Changes in V3:
> 1. rebased on next-20251010
> Link to V2 - https://lore.kernel.org/all/20250911-add_static_tpdm_support-v2-0-608559d36f74@oss.qualcomm.com/
>
> Changes in V2:
> 1. Remove the dependency.
> 2. Collect tags from Rob and Konard for patchset 1 and patchset 3.
> Link to V1 - https://lore.kernel.org/all/20250822103008.1029-1-jie.gan@oss.qualcomm.com/
>
> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
> ---
> Jie Gan (3):
> dt-bindings: arm: document the static TPDM compatible
> coresight: tpdm: add static tpdm support
> arm64: dts: qcom: lemans: enable static TPDM
>
> .../bindings/arm/qcom,coresight-tpdm.yaml | 23 ++-
> arch/arm64/boot/dts/qcom/lemans.dtsi | 105 +++++++++++++
> drivers/hwtracing/coresight/coresight-tpda.c | 7 -
> drivers/hwtracing/coresight/coresight-tpdm.c | 174 +++++++++++++++++----
> drivers/hwtracing/coresight/coresight-tpdm.h | 12 ++
> 5 files changed, 279 insertions(+), 42 deletions(-)
> ---
> base-commit: f7d2388eeec24966fc4d5cf32d706f0514f29ac5
> change-id: 20251028-add_static_tpdm_support-1f62477857e2
>
> Best regards,
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [subset] [PATCH v4 0/3] coresight: add static TPDM support
2025-10-28 10:11 [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
` (3 preceding siblings ...)
2025-11-06 5:20 ` [PATCH v4 0/3] coresight: add static TPDM support Jie Gan
@ 2025-11-06 13:25 ` Suzuki K Poulose
4 siblings, 0 replies; 9+ messages in thread
From: Suzuki K Poulose @ 2025-11-06 13:25 UTC (permalink / raw)
To: Mike Leach, James Clark, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Tingwei Zhang, Mao Jinlong, Tao Zhang,
Alexander Shishkin, Bjorn Andersson, Konrad Dybcio, Jie Gan
Cc: Suzuki K Poulose, linux-arm-msm, coresight, linux-arm-kernel,
devicetree, linux-kernel, Konrad Dybcio
On Tue, 28 Oct 2025 18:11:39 +0800, Jie Gan wrote:
> The static TPDM function as a dummy source, however, it is essential
> to enable the port connected to the TPDA and configure the element size.
> Without this, the TPDA cannot correctly receive trace data from the
> static TPDM. Since the static TPDM does not require MMIO mapping to
> access its registers, a clock controller is not mandatory for its
> operation.
>
> [...]
Applied, thanks!
[1/3] dt-bindings: arm: document the static TPDM compatible
https://git.kernel.org/coresight/c/8d204b6f1f7a
[2/3] coresight: tpdm: add static tpdm support
https://git.kernel.org/coresight/c/14ae052f7947
Best regards,
--
Suzuki K Poulose <suzuki.poulose@arm.com>
^ permalink raw reply [flat|nested] 9+ messages in thread