| From c47532260f7f2ed1cc1fec21ba8c57b09040dfd8 Mon Sep 17 00:00:00 2001 |
| From: Andrew Murray <andrew.murray@arm.com> |
| Date: Thu, 29 Aug 2019 14:28:35 -0600 |
| Subject: [PATCH] coresight: etm4x: Use explicit barriers on enable/disable |
| |
| commit 1004ce4c255fc3eb3ad9145ddd53547d1b7ce327 upstream. |
| |
| Synchronization is recommended before disabling the trace registers |
| to prevent any start or stop points being speculative at the point |
| of disabling the unit (section 7.3.77 of ARM IHI 0064D). |
| |
| Synchronization is also recommended after programming the trace |
| registers to ensure all updates are committed prior to normal code |
| resuming (section 4.3.7 of ARM IHI 0064D). |
| |
| Let's ensure these syncronization points are present in the code |
| and clearly commented. |
| |
| Note that we could rely on the barriers in CS_LOCK and |
| coresight_disclaim_device_unlocked or the context switch to user |
| space - however coresight may be of use in the kernel. |
| |
| On armv8 the mb macro is defined as dsb(sy) - Given that the etm4x is |
| only used on armv8 let's directly use dsb(sy) instead of mb(). This |
| removes some ambiguity and makes it easier to correlate the code with |
| the TRM. |
| |
| Signed-off-by: Andrew Murray <andrew.murray@arm.com> |
| Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com> |
| [Fixed capital letter for "use" in title] |
| Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Link: https://lore.kernel.org/r/20190829202842.580-11-mathieu.poirier@linaro.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c |
| index 8bb0092c7ec2..27e047ebb0ba 100644 |
| --- a/drivers/hwtracing/coresight/coresight-etm4x.c |
| +++ b/drivers/hwtracing/coresight/coresight-etm4x.c |
| @@ -187,6 +187,13 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata) |
| dev_err(drvdata->dev, |
| "timeout while waiting for Idle Trace Status\n"); |
| |
| + /* |
| + * As recommended by section 4.3.7 ("Synchronization when using the |
| + * memory-mapped interface") of ARM IHI 0064D |
| + */ |
| + dsb(sy); |
| + isb(); |
| + |
| done: |
| CS_LOCK(drvdata->base); |
| |
| @@ -452,8 +459,12 @@ static void etm4_disable_hw(void *info) |
| /* EN, bit[0] Trace unit enable bit */ |
| control &= ~0x1; |
| |
| - /* make sure everything completes before disabling */ |
| - mb(); |
| + /* |
| + * Make sure everything completes before disabling, as recommended |
| + * by section 7.3.77 ("TRCVICTLR, ViewInst Main Control Register, |
| + * SSTATUS") of ARM IHI 0064D |
| + */ |
| + dsb(sy); |
| isb(); |
| writel_relaxed(control, drvdata->base + TRCPRGCTLR); |
| |
| -- |
| 2.7.4 |
| |