<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>From: Etienne Carriere <etienne.carriere@stericsson.com><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Secure code in TrustZone space may need to perform L2 cache<o:p></o:p></p><p class=MsoNormal>maintenance operations. A shared mutex is required to synchronize<o:p></o:p></p><p class=MsoNormal><span lang=FR>linux l2cc maintenance and TZ l2cc maintenance.<o:p></o:p></span></p><p class=MsoNormal><span lang=FR><o:p> </o:p></span></p><p class=MsoNormal>The TZ mutex is an "arch_spinlock": a 32bit DDR cell (ARMv7-A mutex).<o:p></o:p></p><p class=MsoNormal>Linux L2 cache driver must lock TZ mutex if enabled.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Signed-off-by: Etienne Carriere <etienne.carriere@stericsson.com><o:p></o:p></p><p class=MsoNormal>---<o:p></o:p></p><p class=MsoNormal> arch/arm/include/asm/outercache.h |  9 ++++<o:p></o:p></p><p class=MsoNormal> arch/arm/mm/cache-l2x0.c          | 87 +++++++++++++++++++++++++++++----------<o:p></o:p></p><p class=MsoNormal> 2 files changed, 74 insertions(+), 22 deletions(-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h<o:p></o:p></p><p class=MsoNormal>index 53426c6..7aa5eac 100644<o:p></o:p></p><p class=MsoNormal>--- a/arch/arm/include/asm/outercache.h<o:p></o:p></p><p class=MsoNormal>+++ b/arch/arm/include/asm/outercache.h<o:p></o:p></p><p class=MsoNormal>@@ -35,6 +35,7 @@ struct outer_cache_fns {<o:p></o:p></p><p class=MsoNormal> #endif<o:p></o:p></p><p class=MsoNormal>                void (*set_debug)(unsigned long);<o:p></o:p></p><p class=MsoNormal>                void (*resume)(void);<o:p></o:p></p><p class=MsoNormal>+             bool (*tz_mutex)(unsigned long);<o:p></o:p></p><p class=MsoNormal> };<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> #ifdef CONFIG_OUTER_CACHE<o:p></o:p></p><p class=MsoNormal>@@ -81,6 +82,13 @@ static inline void outer_resume(void)<o:p></o:p></p><p class=MsoNormal>                                outer_cache.resume();<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>+static inline bool outer_tz_mutex(unsigned long addr)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+             if (outer_cache.tz_mutex)<o:p></o:p></p><p class=MsoNormal>+                             return outer_cache.tz_mutex(addr);<o:p></o:p></p><p class=MsoNormal>+             return false;<o:p></o:p></p><p class=MsoNormal>+}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal> #else<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)<o:p></o:p></p><p class=MsoNormal>@@ -92,6 +100,7 @@ static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)<o:p></o:p></p><p class=MsoNormal> static inline void outer_flush_all(void) { }<o:p></o:p></p><p class=MsoNormal> static inline void outer_inv_all(void) { }<o:p></o:p></p><p class=MsoNormal> static inline void outer_disable(void) { }<o:p></o:p></p><p class=MsoNormal>+static inline bool outer_tz_mutex(unsigned long addr) { return false; }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> #endif<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c<o:p></o:p></p><p class=MsoNormal>index a53fd2a..eacdc74 100644<o:p></o:p></p><p class=MsoNormal>--- a/arch/arm/mm/cache-l2x0.c<o:p></o:p></p><p class=MsoNormal>+++ b/arch/arm/mm/cache-l2x0.c<o:p></o:p></p><p class=MsoNormal>@@ -41,6 +41,26 @@ struct l2x0_of_data {<o:p></o:p></p><p class=MsoNormal>                void (*resume)(void);<o:p></o:p></p><p class=MsoNormal> };<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>+/*<o:p></o:p></p><p class=MsoNormal>+ * arch_spinlock (single 32bit DDR mutex cell) pointer to synchronise<o:p></o:p></p><p class=MsoNormal>+ * L2CC maintenance between linux world and secure world (ARM TZ).<o:p></o:p></p><p class=MsoNormal>+ */<o:p></o:p></p><p class=MsoNormal>+arch_spinlock_t *l2x0_tz_mutex;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#define l2x0_spin_lock_irqsave(flags) \<o:p></o:p></p><p class=MsoNormal>+             do {                                                                                                        \<o:p></o:p></p><p class=MsoNormal>+                             raw_spin_lock_irqsave(&l2x0_lock, flags);           \<o:p></o:p></p><p class=MsoNormal>+                             if (l2x0_tz_mutex)                                                           \<o:p></o:p></p><p class=MsoNormal>+                                             arch_spin_lock(l2x0_tz_mutex);                               \<o:p></o:p></p><p class=MsoNormal>+             } while (0)<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#define l2x0_spin_unlock_irqrestore(flags) \<o:p></o:p></p><p class=MsoNormal>+             do {                                                                                                        \<o:p></o:p></p><p class=MsoNormal>+                             if (l2x0_tz_mutex)                                                           \<o:p></o:p></p><p class=MsoNormal>+                                             arch_spin_unlock(l2x0_tz_mutex);         \<o:p></o:p></p><p class=MsoNormal>+                             raw_spin_unlock_irqrestore(&l2x0_lock, flags);                \<o:p></o:p></p><p class=MsoNormal>+             } while (0)<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal> static inline void cache_wait_way(void __iomem *reg, unsigned long mask)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>                /* wait for cache operation by line or way to complete */<o:p></o:p></p><p class=MsoNormal>@@ -126,9 +146,9 @@ static void l2x0_cache_sync(void)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                cache_sync();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void __l2x0_flush_all(void)<o:p></o:p></p><p class=MsoNormal>@@ -145,9 +165,9 @@ static void l2x0_flush_all(void)<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* clean all ways */<o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                __l2x0_flush_all();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_clean_all(void)<o:p></o:p></p><p class=MsoNormal>@@ -155,11 +175,11 @@ static void l2x0_clean_all(void)<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* clean all ways */<o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_WAY);<o:p></o:p></p><p class=MsoNormal>                cache_wait_way(l2x0_base + L2X0_CLEAN_WAY, l2x0_way_mask);<o:p></o:p></p><p class=MsoNormal>                cache_sync();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_inv_all(void)<o:p></o:p></p><p class=MsoNormal>@@ -167,13 +187,13 @@ static void l2x0_inv_all(void)<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* invalidate all ways */<o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                /* Invalidating when L2 is enabled is a nono */<o:p></o:p></p><p class=MsoNormal>                BUG_ON(readl(l2x0_base + L2X0_CTRL) & 1);<o:p></o:p></p><p class=MsoNormal>                writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY);<o:p></o:p></p><p class=MsoNormal>                cache_wait_way(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);<o:p></o:p></p><p class=MsoNormal>                cache_sync();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_inv_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>@@ -181,7 +201,7 @@ static void l2x0_inv_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                void __iomem *base = l2x0_base;<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                if (start & (CACHE_LINE_SIZE - 1)) {<o:p></o:p></p><p class=MsoNormal>                                start &= ~(CACHE_LINE_SIZE - 1);<o:p></o:p></p><p class=MsoNormal>                                debug_writel(0x03);<o:p></o:p></p><p class=MsoNormal>@@ -206,13 +226,13 @@ static void l2x0_inv_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                                if (blk_end < end) {<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                                <span lang=FR>}<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                }<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                cache_wait(base + L2X0_INV_LINE_PA, 1);<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                cache_sync();<o:p></o:p></span></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_clean_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>@@ -225,7 +245,7 @@ static void l2x0_clean_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                                return;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                start &= ~(CACHE_LINE_SIZE - 1);<o:p></o:p></p><p class=MsoNormal>                while (start < end) {<o:p></o:p></p><p class=MsoNormal>                                unsigned long blk_end = start + min(end - start, 4096UL);<o:p></o:p></p><p class=MsoNormal>@@ -236,13 +256,13 @@ static void l2x0_clean_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                                if (blk_end < end) {<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                                }<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                cache_wait(base + L2X0_CLEAN_LINE_PA, 1);<o:p></o:p></p><p class=MsoNormal>                cache_sync();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_flush_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>@@ -255,7 +275,7 @@ static void l2x0_flush_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                                return;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                start &= ~(CACHE_LINE_SIZE - 1);<o:p></o:p></p><p class=MsoNormal>                while (start < end) {<o:p></o:p></p><p class=MsoNormal>                                unsigned long blk_end = start + min(end - start, 4096UL);<o:p></o:p></p><p class=MsoNormal>@@ -268,24 +288,24 @@ static void l2x0_flush_range(unsigned long start, unsigned long end)<o:p></o:p></p><p class=MsoNormal>                                debug_writel(0x00);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                                if (blk_end < end) {<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>-                                              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal>+                                             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                                }<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                cache_wait(base + L2X0_CLEAN_INV_LINE_PA, 1);<o:p></o:p></p><p class=MsoNormal>                cache_sync();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_disable(void)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>                unsigned long flags;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_lock_irqsave(flags);<o:p></o:p></p><p class=MsoNormal>                __l2x0_flush_all();<o:p></o:p></p><p class=MsoNormal>                writel_relaxed(0, l2x0_base + L2X0_CTRL);<o:p></o:p></p><p class=MsoNormal>                dsb();<o:p></o:p></p><p class=MsoNormal>-              raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             l2x0_spin_unlock_irqrestore(flags);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void l2x0_unlock(u32 cache_id)<o:p></o:p></p><p class=MsoNormal>@@ -307,6 +327,28 @@ static void l2x0_unlock(u32 cache_id)<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>+/* Enable/disable external mutex shared with TZ code */<o:p></o:p></p><p class=MsoNormal>+static bool l2x0_tz_mutex_cfg(unsigned long addr)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+             unsigned long flags;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             raw_spin_lock_irqsave(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             if (addr && l2x0_tz_mutex && (addr != (uint)l2x0_tz_mutex)) {<o:p></o:p></p><p class=MsoNormal>+                             raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: a TZ mutex is already enabled\n", __func__);<o:p></o:p></p><p class=MsoNormal>+                             return false;<o:p></o:p></p><p class=MsoNormal>+             }<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             l2x0_tz_mutex = (arch_spinlock_t *)addr;<o:p></o:p></p><p class=MsoNormal>+             /* insure mutex ptr is updated before lock is released */<o:p></o:p></p><p class=MsoNormal>+             smp_wmb();<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             raw_spin_unlock_irqrestore(&l2x0_lock, flags);<o:p></o:p></p><p class=MsoNormal>+             pr_debug("\n%s: %sable TZ mutex\n\n", __func__, (addr) ? <span lang=FR>"en" : "dis");<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>+             return true;<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>+}<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>+<o:p></o:p></span></p><p class=MsoNormal><span lang=FR> void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)<o:p></o:p></span></p><p class=MsoNormal><span lang=FR> {<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                u32 aux;<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>@@ -380,6 +422,7 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                </span>outer_cache.inv_all = l2x0_inv_all;<o:p></o:p></p><p class=MsoNormal>                <span lang=FR>outer_cache.disable = l2x0_disable;<o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                </span>outer_cache.set_debug = l2x0_set_debug;<o:p></o:p></p><p class=MsoNormal><span lang=FR>+             outer_cache.tz_mutex = l2x0_tz_mutex_cfg;<o:p></o:p></span></p><p class=MsoNormal><span lang=FR> <o:p></o:p></span></p><p class=MsoNormal><span lang=FR>                </span>printk(KERN_INFO "%s cache controller enabled\n", type);<o:p></o:p></p><p class=MsoNormal>                printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n",<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>--<o:p></o:p></p><p class=MsoPlainText>1.7.11.3<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>