coresight: tmc-etr: Handle errors enabling CATU
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 20 Sep 2018 19:18:05 +0000 (13:18 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Sep 2018 18:09:18 +0000 (20:09 +0200)
Make sure we honor the errors in CATU device and abort the operation.
While at it, delay setting the etr_buf for the session until we are
sure that we are indeed enabling the ETR.

Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-tmc-etr.c

index c42693542ec872deb32a6b9d00b1a535a61df1f8..daad521461406d303e4f1986401cc15bf8033360 100644 (file)
@@ -751,12 +751,14 @@ tmc_etr_get_catu_device(struct tmc_drvdata *drvdata)
        return NULL;
 }
 
-static inline void tmc_etr_enable_catu(struct tmc_drvdata *drvdata)
+static inline int tmc_etr_enable_catu(struct tmc_drvdata *drvdata,
+                                     struct etr_buf *etr_buf)
 {
        struct coresight_device *catu = tmc_etr_get_catu_device(drvdata);
 
        if (catu && helper_ops(catu)->enable)
-               helper_ops(catu)->enable(catu, drvdata->etr_buf);
+               return helper_ops(catu)->enable(catu, etr_buf);
+       return 0;
 }
 
 static inline void tmc_etr_disable_catu(struct tmc_drvdata *drvdata)
@@ -971,6 +973,8 @@ static void __tmc_etr_enable_hw(struct tmc_drvdata *drvdata)
 static int tmc_etr_enable_hw(struct tmc_drvdata *drvdata,
                             struct etr_buf *etr_buf)
 {
+       int rc;
+
        /* Callers should provide an appropriate buffer for use */
        if (WARN_ON(!etr_buf))
                return -EINVAL;
@@ -982,16 +986,17 @@ static int tmc_etr_enable_hw(struct tmc_drvdata *drvdata,
        if (WARN_ON(drvdata->etr_buf))
                return -EBUSY;
 
-       /* Set the buffer for the session */
-       drvdata->etr_buf = etr_buf;
        /*
         * If this ETR is connected to a CATU, enable it before we turn
         * this on.
         */
-       tmc_etr_enable_catu(drvdata);
+       rc = tmc_etr_enable_catu(drvdata, etr_buf);
+       if (!rc) {
+               drvdata->etr_buf = etr_buf;
+               __tmc_etr_enable_hw(drvdata);
+       }
 
-       __tmc_etr_enable_hw(drvdata);
-       return 0;
+       return rc;
 }
 
 /*