]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - ipc/ipcdev.git/blobdiff - qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/syslink_main.c
QNX IPC: Add IPU2 MMU Fault Handling
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / build / Qnx / resmgr / syslink_main.c
index 502b294f29e5a24ea4e5ab004dbed8e260b4aac3..3512cc6e11d080e3c94cfad161738e4527573ead 100644 (file)
@@ -302,55 +302,20 @@ syslink_ocb_free (IOFUNC_OCB_T * i_ocb)
     }
 }
 
-/* Initialize the syslink device */
-int init_syslink_device(syslink_dev_t *dev)
+int init_syslink_trace_device(syslink_dev_t *dev)
 {
-    iofunc_attr_t *  attr;
-    syslink_attr_t * trace_attr;
     resmgr_attr_t    resmgr_attr;
     int              i;
+    syslink_attr_t * trace_attr;
     char             trace_name[_POSIX_PATH_MAX];
     int              status = 0;
     u32              da = 0, pa = 0;
     u32              len;
 
-    pthread_mutex_init(&dev->lock, NULL);
-
     memset(&resmgr_attr, 0, sizeof resmgr_attr);
     resmgr_attr.nparts_max = 10;
     resmgr_attr.msg_max_size = 2048;
 
-    memset(&dev->syslink.mattr, 0, sizeof(iofunc_mount_t));
-    dev->syslink.mattr.flags = ST_NOSUID | ST_NOEXEC;
-    dev->syslink.mattr.conf = IOFUNC_PC_CHOWN_RESTRICTED |
-                              IOFUNC_PC_NO_TRUNC |
-                              IOFUNC_PC_SYNC_IO;
-    dev->syslink.mattr.funcs = &dev->syslink.mfuncs;
-
-    memset(&dev->syslink.mfuncs, 0, sizeof(iofunc_funcs_t));
-    dev->syslink.mfuncs.nfuncs = _IOFUNC_NFUNCS;
-
-    iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &dev->syslink.cfuncs,
-                    _RESMGR_IO_NFUNCS, &dev->syslink.iofuncs);
-
-    iofunc_attr_init(attr = &dev->syslink.cattr, S_IFCHR | 0777, NULL, NULL);
-
-    dev->syslink.mfuncs.ocb_calloc = syslink_ocb_calloc;
-    dev->syslink.mfuncs.ocb_free = syslink_ocb_free;
-    dev->syslink.iofuncs.devctl = syslink_devctl;
-    dev->syslink.iofuncs.unblock = syslink_unblock;
-
-    attr->mount = &dev->syslink.mattr;
-    iofunc_time_update(attr);
-
-    if (-1 == (dev->syslink.resmgr_id =
-        resmgr_attach(dev->dpp, &resmgr_attr,
-                      IPC_DEVICE_PATH, _FTYPE_ANY, 0,
-                      &dev->syslink.cfuncs,
-                      &dev->syslink.iofuncs, attr))) {
-        return(-1);
-    }
-
     for (i = 0; i < syslink_num_cores; i++) {
         iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &dev->syslink.cfuncs_trace[i],
                          _RESMGR_IO_NFUNCS, &dev->syslink.iofuncs_trace[i]);
@@ -377,6 +342,10 @@ int init_syslink_device(syslink_dev_t *dev)
                                                 (Ptr) da,
                                                 ProcMgr_AddrType_SlaveVirt);
             }
+            else {
+                GT_setFailureReason(curTrace, GT_4CLASS, "init_syslink_trace_device",
+                                    status, "not performing ProcMgr_translate");
+            }
             /* map length aligned to page size */
             proc_traces[i].va =
                     mmap_device_io (((len + 0x1000 - 1) / 0x1000) * 0x1000, pa);
@@ -385,11 +354,16 @@ int init_syslink_device(syslink_dev_t *dev)
             proc_traces[i].ridx = (uint32_t *)((uint32_t)proc_traces[i].widx + \
                                                sizeof(uint32_t));
             if (proc_traces[i].va == MAP_DEVICE_FAILED) {
+                GT_setFailureReason(curTrace, GT_4CLASS, "init_syslink_trace_device",
+                                    status, "mmap_device_io failed");
+                GT_1trace(curTrace, GT_4CLASS, "errno %d", errno);
                 proc_traces[i].va = NULL;
             }
             proc_traces[i].firstRead = TRUE;
         }
         else {
+            GT_setFailureReason(curTrace, GT_4CLASS, "init_syslink_trace_device",
+                                status, "RscTable_getInfo failed");
             proc_traces[i].va = NULL;
         }
         if (-1 == (dev->syslink.resmgr_id_trace[i] =
@@ -398,25 +372,19 @@ int init_syslink_device(syslink_dev_t *dev)
                                      &dev->syslink.cfuncs_trace[i],
                                      &dev->syslink.iofuncs_trace[i],
                                      &trace_attr->attr))) {
+            GT_setFailureReason(curTrace, GT_4CLASS, "init_syslink_trace_device",
+                                status, "resmgr_attach failed");
             return(-1);
         }
     }
 
-    return(0);
 }
 
-/* De-initialize the syslink device */
-int deinit_syslink_device(syslink_dev_t *dev)
+int deinit_syslink_trace_device(syslink_dev_t *dev)
 {
     int status = EOK;
     int i = 0;
 
-    status = resmgr_detach(dev->dpp, dev->syslink.resmgr_id, 0);
-    if (status < 0) {
-        Osal_printf("syslink: resmgr_detach failed %d", errno);
-        status = errno;
-    }
-
     for (i = 0; i < syslink_num_cores; i++) {
         status = resmgr_detach(dev->dpp, dev->syslink.resmgr_id_trace[i], 0);
         if (status < 0) {
@@ -428,6 +396,78 @@ int deinit_syslink_device(syslink_dev_t *dev)
                    ((proc_traces[i].len + 8 + 0x1000 - 1) / 0x1000) * 0x1000);
         proc_traces[i].va = NULL;
     }
+}
+
+/* Initialize the syslink device */
+int init_syslink_device(syslink_dev_t *dev)
+{
+    iofunc_attr_t *  attr;
+    syslink_attr_t * trace_attr;
+    resmgr_attr_t    resmgr_attr;
+    int              i;
+    char             trace_name[_POSIX_PATH_MAX];
+    int              status = 0;
+    u32              da = 0, pa = 0;
+    u32              len;
+
+    pthread_mutex_init(&dev->lock, NULL);
+
+    memset(&resmgr_attr, 0, sizeof resmgr_attr);
+    resmgr_attr.nparts_max = 10;
+    resmgr_attr.msg_max_size = 2048;
+
+    memset(&dev->syslink.mattr, 0, sizeof(iofunc_mount_t));
+    dev->syslink.mattr.flags = ST_NOSUID | ST_NOEXEC;
+    dev->syslink.mattr.conf = IOFUNC_PC_CHOWN_RESTRICTED |
+                              IOFUNC_PC_NO_TRUNC |
+                              IOFUNC_PC_SYNC_IO;
+    dev->syslink.mattr.funcs = &dev->syslink.mfuncs;
+
+    memset(&dev->syslink.mfuncs, 0, sizeof(iofunc_funcs_t));
+    dev->syslink.mfuncs.nfuncs = _IOFUNC_NFUNCS;
+
+    iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &dev->syslink.cfuncs,
+                    _RESMGR_IO_NFUNCS, &dev->syslink.iofuncs);
+
+    iofunc_attr_init(attr = &dev->syslink.cattr, S_IFCHR | 0777, NULL, NULL);
+
+    dev->syslink.mfuncs.ocb_calloc = syslink_ocb_calloc;
+    dev->syslink.mfuncs.ocb_free = syslink_ocb_free;
+    dev->syslink.iofuncs.devctl = syslink_devctl;
+    dev->syslink.iofuncs.unblock = syslink_unblock;
+
+    attr->mount = &dev->syslink.mattr;
+    iofunc_time_update(attr);
+
+    if (-1 == (dev->syslink.resmgr_id =
+        resmgr_attach(dev->dpp, &resmgr_attr,
+                      IPC_DEVICE_PATH, _FTYPE_ANY, 0,
+                      &dev->syslink.cfuncs,
+                      &dev->syslink.iofuncs, attr))) {
+        return(-1);
+    }
+
+    status = init_syslink_trace_device(dev);
+    if (status < 0) {
+        return status;
+    }
+
+    return(0);
+}
+
+/* De-initialize the syslink device */
+int deinit_syslink_device(syslink_dev_t *dev)
+{
+    int status = EOK;
+    int i = 0;
+
+    status = resmgr_detach(dev->dpp, dev->syslink.resmgr_id, 0);
+    if (status < 0) {
+        Osal_printf("syslink: resmgr_detach failed %d", errno);
+        status = errno;
+    }
+
+    status = deinit_syslink_trace_device(dev);
 
     return(status);
 }
@@ -464,6 +504,8 @@ static void ipc_recover(Ptr args)
 
     deinit_ipc(dev, TRUE);
     init_ipc(dev, syslink_firmware, TRUE);
+    deinit_syslink_trace_device(dev);
+    init_syslink_trace_device(dev);
 }
 
 Int syslink_error_cb (UInt16 procId, ProcMgr_Handle handle,