<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>L2 cache mutex is allocated in DDR from TZ/TEE. <o:p></o:p></p><p class=MsoNormal>Linux retrieves its physical address using from TEE API. <o:p></o:p></p><p class=MsoNormal>It maps it to the kernel address space.<o:p></o:p></p><p class=MsoNormal>Mutex needs to be cacheable, as configured in TZ MMU mapping<o:p></o:p></p><p class=MsoNormal>Once configured from TEE, enable its use by l2cc driver.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This patch assumes no L2 cache maintenance is request to TEE<o:p></o:p></p><p class=MsoNormal>inside the time frame from linux early boot to this "late_initcall<o:p></o:p></p><p class=MsoNormal>of "romcode-sm" probing. The SW architecture insures that.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This patch is an example of how ux500 plans to load the TZ shared<o:p></o:p></p><p class=MsoNormal>mutex into outer cache driver. <o:p></o:p></p><p class=MsoNormal>This patch cannot hit kernel main track. It targets internal kernel <o:p></o:p></p><p class=MsoNormal>Trees with enabled TEE driver (API to TZ world).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Signed-off-by: carriere etienne <etienne.carriere@stericsson.com><o:p></o:p></p><p class=MsoNormal>---<o:p></o:p></p><p class=MsoNormal> arch/arm/mach-ux500/romcode-shared_mutex.c | 111 +++++++++++++++++++++++++++++<o:p></o:p></p><p class=MsoNormal> 1 file changed, 111 insertions(+)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>diff --git a/arch/arm/mach-ux500/romcode-shared_mutex.c b/arch/arm/mach-ux500/romcode-shared_mutex.c<o:p></o:p></p><p class=MsoNormal>new file mode 100644<o:p></o:p></p><p class=MsoNormal>index 0000000..a09df72<o:p></o:p></p><p class=MsoNormal>--- /dev/null<o:p></o:p></p><p class=MsoNormal>+++ b/arch/arm/mach-ux500/romcode-shared_mutex.c<o:p></o:p></p><p class=MsoNormal>@@ -0,0 +1,111 @@<o:p></o:p></p><p class=MsoNormal>+/*<o:p></o:p></p><p class=MsoNormal>+ * Copyright (C) ST-Ericsson SA 2012<o:p></o:p></p><p class=MsoNormal>+ * License terms:  GNU General Public License (GPL), version 2<o:p></o:p></p><p class=MsoNormal>+ * Author:  Etienne Carriere <etienne.carriere@stericsson.com> for ST-Ericsson.<o:p></o:p></p><p class=MsoNormal>+ *<o:p></o:p></p><p class=MsoNormal>+ * ROM code Mutex Configuration for A9 exclusive load and store operation<o:p></o:p></p><p class=MsoNormal>+ * for l2 cache maintenance.<o:p></o:p></p><p class=MsoNormal>+ */<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#include <linux/init.h><o:p></o:p></p><p class=MsoNormal>+#include <linux/module.h><o:p></o:p></p><p class=MsoNormal>+#include <linux/tee.h><o:p></o:p></p><p class=MsoNormal>+#include <linux/io.h><o:p></o:p></p><p class=MsoNormal>+#include <linux/platform_device.h><o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#include <mach/hardware.h><o:p></o:p></p><p class=MsoNormal>+#include <asm/outercache.h><o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#define BASS_ROMCODE_SHARED_MUTEX           0<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+#define UUID_TEE_TA_START_LOW    0xBC765EDE<o:p></o:p></p><p class=MsoNormal>+#define UUID_TEE_TA_START_MID     0x6724<o:p></o:p></p><p class=MsoNormal>+#define UUID_TEE_TA_START_HIGH   0x11DF<o:p></o:p></p><p class=MsoNormal>+#define UUID_TEE_TA_START_CLOCKSEQ  \<o:p></o:p></p><p class=MsoNormal>+             {0x8E, 0x12, 0xEC, 0xDB, 0xDF, 0xD7, 0x20, 0x85}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+static int __devinit shared_mutex_config_probe(struct platform_device *pdev)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+             struct tee_operation op;<o:p></o:p></p><p class=MsoNormal>+             struct tee_session sess;<o:p></o:p></p><p class=MsoNormal>+             struct tee_context ctx;<o:p></o:p></p><p class=MsoNormal>+             uint32_t mutex_type = BASS_ROMCODE_SHARED_MUTEX;<o:p></o:p></p><p class=MsoNormal>+             unsigned int paddr;<o:p></o:p></p><p class=MsoNormal>+             void __iomem *vaddr;<o:p></o:p></p><p class=MsoNormal>+             int err, ori;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             /* Selects trustzone application needed for the job. */<o:p></o:p></p><p class=MsoNormal>+             struct tee_uuid static_uuid = {<o:p></o:p></p><p class=MsoNormal>+                             UUID_TEE_TA_START_LOW,<o:p></o:p></p><p class=MsoNormal>+                             UUID_TEE_TA_START_MID,<o:p></o:p></p><p class=MsoNormal>+                             UUID_TEE_TA_START_HIGH,<o:p></o:p></p><p class=MsoNormal>+                             UUID_TEE_TA_START_CLOCKSEQ,<o:p></o:p></p><p class=MsoNormal>+             };<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             err = teec_initialize_context(NULL, &ctx);<o:p></o:p></p><p class=MsoNormal>+             if (err) {<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: context init failed, 0x%X\n", __func__, err);<o:p></o:p></p><p class=MsoNormal>+                             err = -EINVAL;<o:p></o:p></p><p class=MsoNormal>+                             goto out;<o:p></o:p></p><p class=MsoNormal>+             }<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             err = teec_open_session(&ctx, &sess, &static_uuid,<o:p></o:p></p><p class=MsoNormal>+                                             TEEC_LOGIN_PUBLIC, NULL, NULL, &ori);<o:p></o:p></p><p class=MsoNormal>+             if (err) {<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: session failed, 0x%X/0x%X\n", __func__, err, ori);<o:p></o:p></p><p class=MsoNormal>+                             err = -EINVAL;<o:p></o:p></p><p class=MsoNormal>+                             goto out1;<o:p></o:p></p><p class=MsoNormal>+             }<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             memset(&op, 0, sizeof(op));<o:p></o:p></p><p class=MsoNormal>+             op.param[0].tmpref.buffer = (void *)&paddr;<o:p></o:p></p><p class=MsoNormal>+             op.param[0].tmpref.size = sizeof(uint32_t *);<o:p></o:p></p><p class=MsoNormal>+             op.param[1].tmpref.buffer = (void *)&mutex_type;<o:p></o:p></p><p class=MsoNormal>+             op.param[1].tmpref.size = sizeof(uint32_t);<o:p></o:p></p><p class=MsoNormal>+             op.types = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,<o:p></o:p></p><p class=MsoNormal>+                                             TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             err = teec_invoke_command(&sess, TEE_STA_CONF_SHARED_MUTEX, &op, &ori);<o:p></o:p></p><p class=MsoNormal>+             if (err) {<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: init failed, 0x%X/0x%X", __func__, err, ori);<o:p></o:p></p><p class=MsoNormal>+                             err = -EINVAL;<o:p></o:p></p><p class=MsoNormal>+                             goto out2;<o:p></o:p></p><p class=MsoNormal>+             }<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             vaddr = ioremap_cached((unsigned long)paddr, SZ_1K);<o:p></o:p></p><p class=MsoNormal>+             if (vaddr == NULL) {<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: mutex map failed, 0x%X\n", __func__, paddr);<o:p></o:p></p><p class=MsoNormal>+                             err = -EIO;<o:p></o:p></p><p class=MsoNormal>+                             goto out2;<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 (!outer_tz_mutex((unsigned long)vaddr)) {<o:p></o:p></p><p class=MsoNormal>+                             pr_err("%s: load mutex 0x%08X failed\n", __func__, (uint)vaddr);<o:p></o:p></p><p class=MsoNormal>+                             err = -EIO;<o:p></o:p></p><p class=MsoNormal>+             }<o:p></o:p></p><p class=MsoNormal>+out2:<o:p></o:p></p><p class=MsoNormal>+             (void)teec_close_session(&sess);<o:p></o:p></p><p class=MsoNormal>+out1:<o:p></o:p></p><p class=MsoNormal>+             (void)teec_finalize_context(&ctx);<o:p></o:p></p><p class=MsoNormal>+out:<o:p></o:p></p><p class=MsoNormal>+             return err;<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 struct platform_driver romcode_sm_driver = {<o:p></o:p></p><p class=MsoNormal>+             .driver = {<o:p></o:p></p><p class=MsoNormal>+                             .name = "romcode-sm",<o:p></o:p></p><p class=MsoNormal>+                             .owner = THIS_MODULE,<o:p></o:p></p><p class=MsoNormal>+             },<o:p></o:p></p><p class=MsoNormal>+             .probe = shared_mutex_config_probe,<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 int __init shared_mutex_config_init(void)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+             return platform_driver_register(&romcode_sm_driver);<o:p></o:p></p><p class=MsoNormal>+}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+/* Wait for TEE driver to be initialized. */<o:p></o:p></p><p class=MsoNormal>+late_initcall(shared_mutex_config_init);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+MODULE_LICENSE("GPL v2");<o:p></o:p></p><p class=MsoNormal>+MODULE_DESCRIPTION("TZ shared mutex config");<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>