PDK-8537: Update to the Sciclient_rm logic to handle AM64x MPU1_0 IA to GIC handling...
authorPiyali Goswami <piyali_g@ti.com>
Sun, 6 Dec 2020 06:41:51 +0000 (12:11 +0530)
committerPiyali Goswami <piyali_g@ti.com>
Sun, 6 Dec 2020 07:07:29 +0000 (12:37 +0530)
AM64x is the first device with IA to GIC mapping without an IR in between. This patch handles this case

Fixes: PDK-8537

Signed-off-by: Piyali Goswami <piyali_g@ti.com>
packages/ti/drv/sciclient/src/sciclient/sciclient_rm_irq.c

index 68bea85b81d3ebf657a886a476a3259348e94f68..7e4dfabe6510f7535829d177863d17af394d69e9 100755 (executable)
@@ -429,11 +429,11 @@ static bool Sciclient_rmIrqCfgIsUnmappedVintDirectEvent(uint32_t valid_params);
  * \brief Check if valid parameter configuration is for an event mapping to
  *        VINT only.
  *
  * \brief Check if valid parameter configuration is for an event mapping to
  *        VINT only.
  *
- * \param valid_params Valid params field from message
+ * \param cfg IRQ route configuration
  *
  * \return true if cfg is for event mapping only, else false
  */
  *
  * \return true if cfg is for event mapping only, else false
  */
-static bool Sciclient_rmIrqCfgIsEventToVintMappingOnly(uint32_t valid_params);
+static bool Sciclient_rmIrqCfgIsEventToVintMappingOnly(struct Sciclient_rmIrqCfg *cfg);
 
 /**
  * \brief Check if valid parameter configuration is for OES register
 
 /**
  * \brief Check if valid parameter configuration is for OES register
@@ -889,7 +889,7 @@ int32_t Sciclient_rmProgramInterruptRoute (const struct tisci_msg_rm_irq_set_req
             }
         } else if ((Sciclient_rmIrqCfgIsDirectEvent(cfg.valid_params) ==
                 true) ||
             }
         } else if ((Sciclient_rmIrqCfgIsDirectEvent(cfg.valid_params) ==
                 true) ||
-               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg.valid_params) ==
+               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(&cfg) ==
                 true)) {
             /*
              * Route creation for event-sourced routes, direct
                 true)) {
             /*
              * Route creation for event-sourced routes, direct
@@ -984,7 +984,7 @@ int32_t Sciclient_rmClearInterruptRoute (const struct tisci_msg_rm_irq_release_r
             }
         } else if ((Sciclient_rmIrqCfgIsDirectEvent(cfg.valid_params) ==
                 true) ||
             }
         } else if ((Sciclient_rmIrqCfgIsDirectEvent(cfg.valid_params) ==
                 true) ||
-               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg.valid_params) ==
+               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(&cfg) ==
                 true)) {
             /* Route removal for event-source routes */
             r = Sciclient_rmIrqVintDelete(&cfg);
                 true)) {
             /* Route removal for event-source routes */
             r = Sciclient_rmIrqVintDelete(&cfg);
@@ -1438,10 +1438,10 @@ static bool Sciclient_rmIrqCfgIsUnmappedVintDirectEvent(uint32_t valid_params)
     return r;
 }
 
     return r;
 }
 
-static bool Sciclient_rmIrqCfgIsEventToVintMappingOnly(uint32_t valid_params)
+static bool Sciclient_rmIrqCfgIsEventToVintMappingOnly(struct Sciclient_rmIrqCfg  *cfg)
 {
     bool r = false;
 {
     bool r = false;
-
+    uint32_t valid_params = cfg->valid_params;
     /*
      * The interrupt configuration is for an event sourced route but
      * configuration ends at the IA VINT.
     /*
      * The interrupt configuration is for an event sourced route but
      * configuration ends at the IA VINT.
@@ -1461,6 +1461,35 @@ static bool Sciclient_rmIrqCfgIsEventToVintMappingOnly(uint32_t valid_params)
         r = true;
     }
 
         r = true;
     }
 
+    /* Handle the case where the IA is directly connected without IR */
+    if (r == false)
+    {
+        int32_t ret = CSL_PASS;
+        const struct Sciclient_rmIrqNode *ia_node;
+        const struct Sciclient_rmIrqIf *iface;
+        bool found_iface = false;
+        uint32_t i;
+        ret = Sciclient_rmIrqGetNode(cfg->s_ia, &ia_node);
+        if (ret == CSL_PASS) {
+            for (i = 0U; i < ia_node->n_if; i++) {
+                ret = Sciclient_rmIrqGetNodeItf(ia_node, i, &iface);
+                if (ret != CSL_PASS) {
+                    break;
+                }
+
+                if ((cfg->vint >= iface->lbase) &&
+                    (cfg->vint < (iface->lbase + iface->len))) {
+                    found_iface = true;
+                    break;
+                }
+            }
+            if ((found_iface == true) && !Sciclient_rmIrIsIr(iface->rid))
+            {
+                r = true;
+            }
+        }
+    }
+
     return r;
 }
 
     return r;
 }
 
@@ -1518,13 +1547,22 @@ static int32_t Sciclient_rmIrqIsVintRouteSet(struct Sciclient_rmIrqCfg  *cfg,
         }
     }
 
         }
     }
 
-    if (found_iface) {
+    if ((found_iface == true) && Sciclient_rmIrIsIr(iface->rid)) {
         /* Check if the IR input tied to the IA VINT is in use. */
         ir_inp = SCICLIENT_OUTP_TO_INP(cfg->vint, iface->lbase, iface->rbase);
         if (Sciclient_rmIrInpIsFree(iface->rid, ir_inp) != CSL_PASS) {
             *vint_used = true;
         }
     }
         /* Check if the IR input tied to the IA VINT is in use. */
         ir_inp = SCICLIENT_OUTP_TO_INP(cfg->vint, iface->lbase, iface->rbase);
         if (Sciclient_rmIrInpIsFree(iface->rid, ir_inp) != CSL_PASS) {
             *vint_used = true;
         }
     }
+    else if (!Sciclient_rmIrIsIr(iface->rid))
+    {
+        /* The IA is the only one in the route from IA to Destination */
+        *vint_used = false;
+    }
+    else
+    {
+        *vint_used = false;
+    }
 
     return r;
 }
 
     return r;
 }
@@ -1999,7 +2037,7 @@ static int32_t Sciclient_rmIrqVintAdd(struct Sciclient_rmIrqCfg *cfg)
 
     if (r == CSL_PASS) {
         if ((vint_used == true) ||
 
     if (r == CSL_PASS) {
         if ((vint_used == true) ||
-            (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg->valid_params) ==
+            (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg) ==
              true)) {
             /*
              * VINT already has events mapped to it or
              true)) {
             /*
              * VINT already has events mapped to it or
@@ -2338,7 +2376,7 @@ static int32_t Sciclient_rmIrqVintDelete(struct Sciclient_rmIrqCfg  *cfg)
             /* No events to unmap */
             r = CSL_EBADARGS;
         } else if ((num_evts > 1u) ||
             /* No events to unmap */
             r = CSL_EBADARGS;
         } else if ((num_evts > 1u) ||
-               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg->valid_params) ==
+               (Sciclient_rmIrqCfgIsEventToVintMappingOnly(cfg) ==
                 true)) {
             /*
              * VINT has multiple events mapped to it or
                 true)) {
             /*
              * VINT has multiple events mapped to it or