]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
coresight: Add claim tag warnings and debug messages
authorJames Clark <james.clark@linaro.org>
Tue, 25 Mar 2025 11:58:48 +0000 (11:58 +0000)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 30 Apr 2025 13:58:18 +0000 (14:58 +0100)
Add a dev_dbg() message so that external debugger conflicts are more
visible. There are multiple reasons for -EBUSY so a message for this
particular one could be helpful. Add errors for and enumerate all the
other cases that are impossible.

Reviewed-by: Leo Yan <leo.yan@arm.com>
Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com>
Signed-off-by: James Clark <james.clark@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250325-james-coresight-claim-tags-v4-3-dfbd3822b2e5@linaro.org
drivers/hwtracing/coresight/coresight-core.c
drivers/hwtracing/coresight/coresight-priv.h

index 9f183064285dae4277ed41918f0b41a175aa4091..8f2a40510b09abe0157a58aecbe839ea2871b821 100644 (file)
@@ -135,16 +135,6 @@ static inline u32 coresight_read_claim_tags_unlocked(struct coresight_device *cs
                         csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR));
 }
 
-static inline bool coresight_is_claimed_self_hosted(struct coresight_device *csdev)
-{
-       return coresight_read_claim_tags_unlocked(csdev) == CORESIGHT_CLAIM_SELF_HOSTED;
-}
-
-static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
-{
-       return coresight_read_claim_tags_unlocked(csdev) != 0;
-}
-
 static inline void coresight_set_self_claim_tag_unlocked(struct coresight_device *csdev)
 {
        csdev_access_relaxed_write32(&csdev->access, CORESIGHT_CLAIM_SELF_HOSTED,
@@ -182,18 +172,41 @@ EXPORT_SYMBOL_GPL(coresight_clear_self_claim_tag_unlocked);
  */
 int coresight_claim_device_unlocked(struct coresight_device *csdev)
 {
+       int tag;
+       struct csdev_access *csa;
+
        if (WARN_ON(!csdev))
                return -EINVAL;
 
-       if (coresight_is_claimed_any(csdev))
+       csa = &csdev->access;
+       tag = coresight_read_claim_tags_unlocked(csdev);
+
+       switch (tag) {
+       case CORESIGHT_CLAIM_FREE:
+               coresight_set_self_claim_tag_unlocked(csdev);
+               if (coresight_read_claim_tags_unlocked(csdev) == CORESIGHT_CLAIM_SELF_HOSTED)
+                       return 0;
+
+               /* There was a race setting the tag, clean up and fail */
+               coresight_clear_self_claim_tag_unlocked(csa);
+               dev_dbg(&csdev->dev, "Busy: Couldn't set self claim tag");
                return -EBUSY;
 
-       coresight_set_self_claim_tag_unlocked(csdev);
-       if (coresight_is_claimed_self_hosted(csdev))
-               return 0;
-       /* There was a race setting the tag, clean up and fail */
-       coresight_clear_self_claim_tag_unlocked(&csdev->access);
-       return -EBUSY;
+       case CORESIGHT_CLAIM_EXTERNAL:
+               /* External debug is an expected state, so log and report BUSY */
+               dev_dbg(&csdev->dev, "Busy: Claimed by external debugger");
+               return -EBUSY;
+
+       default:
+       case CORESIGHT_CLAIM_SELF_HOSTED:
+       case CORESIGHT_CLAIM_INVALID:
+               /*
+                * Warn here because we clear a lingering self hosted tag
+                * on probe, so other tag combinations are impossible.
+                */
+               dev_err_once(&csdev->dev, "Invalid claim tag state: %x", tag);
+               return -EBUSY;
+       }
 }
 EXPORT_SYMBOL_GPL(coresight_claim_device_unlocked);
 
@@ -222,7 +235,7 @@ void coresight_disclaim_device_unlocked(struct coresight_device *csdev)
        if (WARN_ON(!csdev))
                return;
 
-       if (coresight_is_claimed_self_hosted(csdev))
+       if (coresight_read_claim_tags_unlocked(csdev) == CORESIGHT_CLAIM_SELF_HOSTED)
                coresight_clear_self_claim_tag_unlocked(&csdev->access);
        else
                /*
@@ -230,7 +243,7 @@ void coresight_disclaim_device_unlocked(struct coresight_device *csdev)
                 * and has manipulated it. Or something else has seriously
                 * gone wrong in our driver.
                 */
-               WARN_ON_ONCE(1);
+               dev_WARN_ONCE(&csdev->dev, 1, "External agent took claim tag");
 }
 EXPORT_SYMBOL_GPL(coresight_disclaim_device_unlocked);
 
index 38bb4e8b50ef6b7ea27dc7b9e9428808665b2fb6..6e8cf55aee0aa5f2c7b5ae3167a72c7bfb13e800 100644 (file)
@@ -36,7 +36,10 @@ extern const struct device_type coresight_dev_type[];
  * See PSCI - ARM DEN 0022D, Section: 6.8.1 Debug and Trace save and restore.
  */
 #define CORESIGHT_CLAIM_MASK           GENMASK(1, 0)
-#define CORESIGHT_CLAIM_SELF_HOSTED    BIT(1)
+#define CORESIGHT_CLAIM_FREE           0
+#define CORESIGHT_CLAIM_EXTERNAL       1
+#define CORESIGHT_CLAIM_SELF_HOSTED    2
+#define CORESIGHT_CLAIM_INVALID                3
 
 #define TIMEOUT_US             100
 #define BMVAL(val, lsb, msb)   ((val & GENMASK(msb, lsb)) >> lsb)