coresight: Do not default to CPU0 for missing CPU phandle
authorSai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
Thu, 4 Jul 2019 09:53:05 +0000 (15:23 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Jul 2019 10:23:26 +0000 (12:23 +0200)
Coresight platform support assumes that a missing "cpu" phandle
defaults to CPU0. This could be problematic and unnecessarily binds
components to CPU0, where they may not be. In coresight etm and
cpu-debug drivers, abort the probe for such cases.

Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Tested-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/f1955ea19c714cf64ea54ec356a9aa85f3cd17b8.1562229018.git.saiprakash.ranjan@codeaurora.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-cpu-debug.c
drivers/hwtracing/coresight/coresight-etm3x.c
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-platform.c

index 07a1367c733f1b0711c0a217d89ab3e4c90b6f59..58bfd6319f65e40dbc8dc57e27ae69092f36400f 100644 (file)
@@ -579,6 +579,9 @@ static int debug_probe(struct amba_device *adev, const struct amba_id *id)
                return -ENOMEM;
 
        drvdata->cpu = coresight_get_cpu(dev);
+       if (drvdata->cpu < 0)
+               return drvdata->cpu;
+
        if (per_cpu(debug_drvdata, drvdata->cpu)) {
                dev_err(dev, "CPU%d drvdata has already been initialized\n",
                        drvdata->cpu);
index 225c2982e4fe0dce188b776d1008a2e5e3380475..e2cb6873c3f219a6d937a182758b630ebc6da305 100644 (file)
@@ -816,6 +816,9 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
        }
 
        drvdata->cpu = coresight_get_cpu(dev);
+       if (drvdata->cpu < 0)
+               return drvdata->cpu;
+
        desc.name  = devm_kasprintf(dev, GFP_KERNEL, "etm%d", drvdata->cpu);
        if (!desc.name)
                return -ENOMEM;
index 7fe266194ab5bf506636fcf27f811ec9c465ef99..7bcac8896fc1d7f266176bdaddbdfbab318ed73e 100644 (file)
@@ -1101,6 +1101,9 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
        spin_lock_init(&drvdata->spinlock);
 
        drvdata->cpu = coresight_get_cpu(dev);
+       if (drvdata->cpu < 0)
+               return drvdata->cpu;
+
        desc.name = devm_kasprintf(dev, GFP_KERNEL, "etm%d", drvdata->cpu);
        if (!desc.name)
                return -ENOMEM;
index 3c5ceda8db2412406c99fed9323fddfb76fc63e5..cf580ffbc27c5822cffb30c4814abedb3c144d44 100644 (file)
@@ -159,16 +159,16 @@ static int of_coresight_get_cpu(struct device *dev)
        struct device_node *dn;
 
        if (!dev->of_node)
-               return 0;
+               return -ENODEV;
+
        dn = of_parse_phandle(dev->of_node, "cpu", 0);
-       /* Affinity defaults to CPU0 */
        if (!dn)
-               return 0;
+               return -ENODEV;
+
        cpu = of_cpu_node_to_id(dn);
        of_node_put(dn);
 
-       /* Affinity to CPU0 if no cpu nodes are found */
-       return (cpu < 0) ? 0 : cpu;
+       return cpu;
 }
 
 /*
@@ -310,7 +310,7 @@ of_get_coresight_platform_data(struct device *dev,
 
 static inline int of_coresight_get_cpu(struct device *dev)
 {
-       return 0;
+       return -ENODEV;
 }
 #endif
 
@@ -734,14 +734,14 @@ static int acpi_coresight_get_cpu(struct device *dev)
        struct acpi_device *adev = ACPI_COMPANION(dev);
 
        if (!adev)
-               return 0;
+               return -ENODEV;
        status = acpi_get_parent(adev->handle, &cpu_handle);
        if (ACPI_FAILURE(status))
-               return 0;
+               return -ENODEV;
 
        cpu = acpi_handle_to_logical_cpuid(cpu_handle);
        if (cpu >= nr_cpu_ids)
-               return 0;
+               return -ENODEV;
        return cpu;
 }
 
@@ -769,7 +769,7 @@ acpi_get_coresight_platform_data(struct device *dev,
 
 static inline int acpi_coresight_get_cpu(struct device *dev)
 {
-       return 0;
+       return -ENODEV;
 }
 #endif