Fix GateMP to allow SR0's physical address to be different from its virtual
authorvwan@ti.com <vwan@ti.com>
Tue, 6 Jan 2015 18:18:47 +0000 (10:18 -0800)
committerRobert Tivy <rtivy@ti.com>
Fri, 9 Jan 2015 19:32:15 +0000 (11:32 -0800)
This commit fixes GateMP host-support (when host is running an HLOS) to allow
SR0's physical address to be a different value from its virtual address on the
slave core, by performing a virtual to physical address translation on the
addresses of the inUse arrays prior to stashing them into a NameServer entry
on the slave.

This addresses CQ SDOCM00113149.

Signed-off-by: VW <vwan@ti.com>
packages/ti/sdo/ipc/GateMP.c
packages/ti/sdo/ipc/GateMP.xdc
packages/ti/sdo/ipc/GateMP.xdt [new file with mode: 0644]
packages/ti/sdo/ipc/_GateMP.h

index fe44d095299423bfcd1b4bd22361d315604ab904..a3d90b3176280a0b38aaffe48d89e38f6183c0a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -630,6 +630,7 @@ Void ti_sdo_ipc_GateMP_setRegion0Reserved(Ptr sharedAddr)
     UInt i;
     Bits32 *delegateReservedMask;
     UInt32 nsValue[6];
+    Int ret;
 
     minAlign = Memory_getMaxDefaultTypeAlign();
     if (SharedRegion_getCacheLineSize(0) > minAlign) {
@@ -751,9 +752,15 @@ Void ti_sdo_ipc_GateMP_setRegion0Reserved(Ptr sharedAddr)
 
     if (GateMP_module->hostSupport == TRUE) {
         /* Add special entry to store inuse arrays' location and size */
-        nsValue[0] = (UInt32)GateMP_module->remoteSystemInUse;
-        nsValue[1] = (UInt32)GateMP_module->remoteCustom1InUse;
-        nsValue[2] = (UInt32)GateMP_module->remoteCustom2InUse;
+        ret = _GateMP_virtToPhys(
+            (UInt32)GateMP_module->remoteSystemInUse, &nsValue[0]);
+        Assert_isTrue(ret == GateMP_S_SUCCESS, (Assert_Id)NULL);
+        ret = _GateMP_virtToPhys(
+            (UInt32)GateMP_module->remoteCustom1InUse, &nsValue[1]);
+        Assert_isTrue(ret == GateMP_S_SUCCESS, (Assert_Id)NULL);
+        ret = _GateMP_virtToPhys(
+            (UInt32)GateMP_module->remoteCustom2InUse, &nsValue[2]);
+        Assert_isTrue(ret == GateMP_S_SUCCESS, (Assert_Id)NULL);
         nsValue[3] = GateMP_module->numRemoteSystem;
         nsValue[4] = GateMP_module->numRemoteCustom1;
         nsValue[5] = GateMP_module->numRemoteCustom2;
index fb09a5656bb0be67bc43f29dcd6559cf0a33bb03..73b6d96cdbca0dedfc7479a7dd46a87fd9bdb397 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2015, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -74,6 +74,7 @@ import ti.sdo.ipc.interfaces.IGateMPSupport;
 @InstanceInitError
 @InstanceFinalize
 
+@Template("./GateMP.xdt")
 module GateMP
 {
     /*!
diff --git a/packages/ti/sdo/ipc/GateMP.xdt b/packages/ti/sdo/ipc/GateMP.xdt
new file mode 100644 (file)
index 0000000..7d38a28
--- /dev/null
@@ -0,0 +1,62 @@
+%%{
+/*
+ * Copyright (c) 2015, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * *  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * *  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * *  Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+%%}
+
+#include <ti/ipc/GateMP.h>
+
+%var resource = xdc.module('ti.ipc.remoteproc.Resource');
+
+%if (resource.$used) {
+#include <ti/ipc/remoteproc/Resource.h>
+%}
+
+/* Convert a virtual address to its physical address */
+Int _GateMP_virtToPhys(UInt32 va, UInt32 *pa)
+{
+    Int ret;
+
+%if (resource.$used) {
+    ret = ti_ipc_remoteproc_Resource_virtToPhys(va, pa);
+    if (ret < 0) {
+        return (GateMP_E_FAIL);
+    }
+    else {
+        return (GateMP_S_SUCCESS);
+    }
+%}
+%else {
+    /* We don't have any facility to do translation. */
+    return (GateMP_E_FAIL);
+%}
+
+}
index 195f9aec9b48dd0a46b10f4a08e002c64a605605..a74e5de45e081b926853893e2b4e6ad4dcf4fb0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2015, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -39,3 +39,5 @@
 #include <ti/sdo/ipc/GateMP.h>
 
 #include <ti/ipc/GateMP.h>
+
+Int _GateMP_virtToPhys(UInt32 va, UInt32 *pa);