MessageQ: Fix for Linux msgs sent to wrong slave 3.10.00.05_eng
authorChris Ring <cring@ti.com>
Sat, 24 Aug 2013 14:57:24 +0000 (07:57 -0700)
committerChris Ring <cring@ti.com>
Sat, 24 Aug 2013 16:14:37 +0000 (09:14 -0700)
Previously the MultiProc-to-Linux-kernel-rproc-index mapping was
hard-coded in the MessageQ-based socket library to be
rprocIndex = MultiProc_id - 1.  This was too simple for the async
loading use cases on systems with > 1 slave.

A recent kernel patch looks up the rpmsg channel based on Linux
kernel rproc index, meaning the socket's 'connect' and 'bind'
calls now need to provide the actual rproc index.  Today's Linux
kernels ensure the rproc index will be consistent from run to run
(so long as all slaves are configured enabled), so this rproc-
index-to-MultiProc-id can be known and hard-coded ahead of time.

This commit records that hard-coding in the MultiProcCfg_*.c
source files, and now provides the appropriate rproc index in
the socket 'connect' and 'bind' calls.

This user-space commit requires a matching update to the kernel
space drivers.

linux/include/_MultiProc.h
linux/src/daemon/MultiProcCfg_dra7xx.c
linux/src/daemon/MultiProcCfg_omap54xx_smp.c
linux/src/daemon/MultiProcCfg_omapl138.c
linux/src/daemon/MultiProcCfg_tci6614.c
linux/src/daemon/MultiProcCfg_tci6638.c
linux/src/utils/SocketFxns.c

index 39ed3858e654c9455f5f5d4389acf2057775a1fe..a93f36ec1ba5e5b2a5a434e1a484d2fee0ddbc11 100644 (file)
@@ -65,6 +65,8 @@ typedef struct MultiProc_Config_tag {
     /*!< Max number of procs for particular system */
     Char   nameList [MultiProc_MAXPROCESSORS][MultiProc_MAXNAMELENGTH];
     /*!< Name List for processors in the system */
+    Int32  rprocList[MultiProc_MAXPROCESSORS];
+    /*!< Linux "remoteproc index" for processors in the system */
     UInt16 id;
     /*!< Local Proc ID. This needs to be set before calling any other APIs */
 } MultiProc_Config;
index 8f4e76704f220b23c980e78565d6e24f1f914412..10c88ccfc50071580679162594fc8c6b872117f7 100644 (file)
@@ -48,5 +48,10 @@ MultiProc_Config _MultiProc_cfg =  {
    .nameList[2] = "IPU1",
    .nameList[3] = "DSP2",
    .nameList[4] = "DSP1",
+   .rprocList[0] = -1,
+   .rprocList[1] = 1,
+   .rprocList[2] = 3,
+   .rprocList[3] = 2,
+   .rprocList[4] = 0,
    .id = 0,                 /* The host is always zero */
 };
index 1a48ffb71c2755d5c55caaaae9b5e29b0ed557ab..3cabbac980572a261d9fa9141e9594620e6ff28b 100644 (file)
@@ -46,5 +46,8 @@ MultiProc_Config _MultiProc_cfg =  {
    .nameList[0] = "HOST",
    .nameList[1] = "IPU",
    .nameList[2] = "DSP",
+   .rprocList[0] = -1,
+   .rprocList[1] = 1,
+   .rprocList[2] = 0,
    .id = 0,                 /* The host is always zero */
 };
index d114aff3301bd294ff00bb0888431add6edaf593..d7508e8eedefe7554f9f8c35d96b231fea4428eb 100644 (file)
@@ -45,5 +45,7 @@ MultiProc_Config _MultiProc_cfg =  {
    .numProcessors = 2,
    .nameList[0] = "HOST",
    .nameList[1] = "DSP",
+   .rprocList[0] = -1,
+   .rprocList[1] = 0,
    .id = 0,                 /* The host is always zero */
 };
index 08b84b2666ec34c336db6c92985f352a0bc02b9d..1528b25099ba8b994ad46e384738ace9ae44bc5d 100644 (file)
@@ -48,5 +48,10 @@ MultiProc_Config _MultiProc_cfg =  {
    .nameList[2] = "CORE1",
    .nameList[3] = "CORE2",
    .nameList[4] = "CORE3",
+   .rprocList[0] = -1,
+   .rprocList[1] = 0,
+   .rprocList[2] = 1,
+   .rprocList[3] = 2,
+   .rprocList[4] = 3,
    .id = 0,                 /* The host is always zero */
 };
index 3490732f0779625e2016b216a2dc6f3beefe3d36..18b338a8d5fa3730e7b161d68f1c90dec87eb215 100644 (file)
@@ -52,5 +52,14 @@ MultiProc_Config _MultiProc_cfg =  {
    .nameList[6] = "CORE5",
    .nameList[7] = "CORE6",
    .nameList[8] = "CORE7",
+   .rprocList[0] = -1,
+   .rprocList[1] = 0,
+   .rprocList[2] = 1,
+   .rprocList[3] = 2,
+   .rprocList[4] = 3,
+   .rprocList[5] = 4,
+   .rprocList[6] = 5,
+   .rprocList[7] = 6,
+   .rprocList[8] = 7,
    .id = 0,                 /* The host is always zero */
 };
index 5666beb713662174aac7bbccbf4a869b21a9a6de..bbb40fadb24507cb7d9f5beb579db2a5f2fd28ac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Texas Instruments Incorporated
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -52,6 +52,9 @@
 /* For PRINTVERBOSE* */
 #include <_lad.h>
 
+/* For MultiProc id to remoteproc index map */
+#include <_MultiProc.h>
+
 static Bool verbose = FALSE;
 
 int ConnectSocket(int sock, UInt16 procId, int dst)
@@ -63,8 +66,8 @@ int ConnectSocket(int sock, UInt16 procId, int dst)
     /* connect to remote service */
     memset(&dstAddr, 0, sizeof(dstAddr));
     dstAddr.family     = AF_RPMSG;
-     /* rpmsg "vproc_id" is one less than the MultiProc ID: */
-    dstAddr.vproc_id   = procId - 1;
+    /* convert MultiProc 'procId' to remoteproc index */
+    dstAddr.vproc_id   = _MultiProc_cfg.rprocList[procId];
     dstAddr.addr       = dst;
 
     len = sizeof(struct sockaddr_rpmsg);
@@ -99,7 +102,7 @@ int SocketBindAddr(int fd, UInt16 rprocId, UInt32 localAddr)
     memset(&srcAddr, 0, sizeof(srcAddr));
     srcAddr.family = AF_RPMSG;
     /* We bind the remote proc ID, but local address! */
-    srcAddr.vproc_id = (rprocId - 1);
+    srcAddr.vproc_id   = _MultiProc_cfg.rprocList[rprocId];
     srcAddr.addr  = localAddr;
 
     len = sizeof(struct sockaddr_rpmsg);