summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Pledge <roy.pledge@nxp.com>2017-05-25 20:59:08 (GMT)
committerXie Xiaobo <xiaobo.xie@nxp.com>2017-12-12 07:32:32 (GMT)
commit33753ff1aee7ca9abf1832dbab5b50235a6c829b (patch)
treef7e9ef99b1a2ba0a87e285f46b91f9342df63949
parent663314bf0d55ab3713a39e4a7dcc423b5390c9d5 (diff)
downloadlinux-33753ff1aee7ca9abf1832dbab5b50235a6c829b.tar.xz
fsl_qbman/usdpaa: Invalidate software portals before use
Invalidate the cache for the software portals before using them since the portals are non coherent. This ensures that the core using the portal is seeing the most up to date information in case the cache contained older data. This is important during the cleanup phase if cleanup occurs on a differnt core than what the application was using. Signed-off-by: Roy Pledge <roy.pledge@nxp.com>
-rw-r--r--drivers/staging/fsl_qbman/fsl_usdpaa.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/staging/fsl_qbman/fsl_usdpaa.c b/drivers/staging/fsl_qbman/fsl_usdpaa.c
index 3a6d3722..ec5ea6e 100644
--- a/drivers/staging/fsl_qbman/fsl_usdpaa.c
+++ b/drivers/staging/fsl_qbman/fsl_usdpaa.c
@@ -371,6 +371,16 @@ static int usdpaa_open(struct inode *inode, struct file *filp)
#define DQRR_MAXFILL 15
+
+/* Invalidate a portal */
+void dbci_portal(void *addr)
+{
+ int i;
+
+ for (i = 0; i < 0x4000; i += 64)
+ dcbi(addr + i);
+}
+
/* Reset a QMan portal to its default state */
static int init_qm_portal(struct qm_portal_config *config,
struct qm_portal *portal)
@@ -384,6 +394,13 @@ static int init_qm_portal(struct qm_portal_config *config,
/* Make sure interrupts are inhibited */
qm_out(IIR, 1);
+ /*
+ * Invalidate the entire CE portal are to ensure no stale
+ * cachelines are present. This should be done on all
+ * cores as the portal is mapped as M=0 (non-coherent).
+ */
+ on_each_cpu(dbci_portal, portal->addr.addr_ce, 1);
+
/* Initialize the DQRR. This will stop any dequeue
commands that are in progress */
if (qm_dqrr_init(portal, config, qm_dqrr_dpush, qm_dqrr_pvb,
@@ -435,6 +452,13 @@ static int init_bm_portal(struct bm_portal_config *config,
portal->addr.addr_ce = config->addr_virt[DPA_PORTAL_CE];
portal->addr.addr_ci = config->addr_virt[DPA_PORTAL_CI];
+ /*
+ * Invalidate the entire CE portal are to ensure no stale
+ * cachelines are present. This should be done on all
+ * cores as the portal is mapped as M=0 (non-coherent).
+ */
+ on_each_cpu(dbci_portal, portal->addr.addr_ce, 1);
+
if (bm_rcr_init(portal, bm_rcr_pvb, bm_rcr_cce)) {
pr_err("Bman RCR initialisation failed\n");
return 1;