Use core-specific WUGEN masks for suspend on OMAP 3.23.00.01
authorRobert Tivy <rtivy@ti.com>
Wed, 13 Aug 2014 23:42:38 +0000 (16:42 -0700)
committerRobert Tivy <rtivy@ti.com>
Thu, 14 Aug 2014 00:50:46 +0000 (17:50 -0700)
The WUGEN event masks for each core are set to values appropriate
for the architecture and core.

A new API is added that allows the application to control the WUGEN
event mask (IpcPower_{get,set}WugenEvtMask()).

Addresses CQ SDOCM00108585.

packages/ti/pm/IpcPower.c
packages/ti/pm/IpcPower.h
packages/ti/pm/_IpcPower.h
packages/ti/pm/package.bld
packages/ti/pm/package.xs

index 325ad1bc1d294b1e31d9ae65aca57530ffb78f80..9b8df15276fa39107956da63a32b1ae284650d60 100644 (file)
 #ifndef SMP
 #include <ti/sysbios/family/arm/ducati/omap4430/Power.h>
 #include <ti/sysbios/family/arm/ducati/Core.h>
-#include <ti/ipc/MultiProc.h>
 #else
 #include <ti/sysbios/family/arm/ducati/smp/Power.h>
 #endif
 
+#include <ti/ipc/MultiProc.h>
 #include <ti/pm/IpcPower.h>
 #include "_IpcPower.h"
 
@@ -119,6 +119,8 @@ typedef enum IpcPower_SleepMode {
 /* Deep sleep state variable for IpcPower module */
 static Bool IpcPower_deepSleep = TRUE;
 
+static IpcPower_WugenEvtMask wugenEvtMask;
+
 
 /*
  *  ======== IpcPower_callUserFxns ========
@@ -161,9 +163,28 @@ static inline Void IpcPower_sleepMode(IpcPower_SleepMode opt)
     Hwi_restore(hwiKey);
 }
 
-static inline Void IpcPower_setWugen()
+Void IpcPower_getWugenEvtMask(IpcPower_WugenEvtMask *mask)
+{
+    mask->mevt0 = wugenEvtMask.mevt0;
+    mask->mevt1 = wugenEvtMask.mevt1;
+}
+
+Void IpcPower_setWugenEvtMask(IpcPower_WugenEvtMask *mask)
+{
+    wugenEvtMask.mevt0 = mask->mevt0;
+    wugenEvtMask.mevt1 = mask->mevt1;
+}
+
+static inline Void IpcPower_getWugen(IpcPower_WugenEvtMask *mask)
 {
-    REG32(WUGEN_MEVT1) |= WUGEN_INT_MASK;
+    mask->mevt0 = REG32(WUGEN_MEVT0);
+    mask->mevt1 = REG32(WUGEN_MEVT1);
+}
+
+static inline Void IpcPower_setWugen(IpcPower_WugenEvtMask *mask)
+{
+    REG32(WUGEN_MEVT0) = mask->mevt0;
+    REG32(WUGEN_MEVT1) = mask->mevt1;
 }
 
 /*
@@ -191,7 +212,7 @@ static Void IpcPower_suspendSwi(UArg arg0, UArg arg1)
     Power_suspend(&PowerSuspArgs);
 #ifndef SMP
     IpcPower_sleepMode(IpcPower_SLEEP_MODE_DEEPSLEEP);
-    IpcPower_setWugen();
+    IpcPower_setWugen(&wugenEvtMask);
 
     Log_print0(Diags_INFO, FXNN":Resume");
 #endif
@@ -299,7 +320,22 @@ Void IpcPower_init()
 #endif
     PowerSuspArgs.intMask79_64 = 0x0;
     IpcPower_sleepMode(IpcPower_SLEEP_MODE_DEEPSLEEP);
-    IpcPower_setWugen();
+
+    IpcPower_getWugen(&wugenEvtMask);
+#ifdef OMAP5
+    wugenEvtMask.mevt0 |= OMAP_IPU_WUGEN_INT_MASK0;
+    wugenEvtMask.mevt1 |= OMAP_IPU_WUGEN_INT_MASK1;
+#else
+    if (MultiProc_self() == MultiProc_getId("IPU2")) {
+        wugenEvtMask.mevt0 |= VAYU_IPU2_WUGEN_INT_MASK0;
+        wugenEvtMask.mevt1 |= VAYU_IPU2_WUGEN_INT_MASK1;
+    }
+    else {
+        wugenEvtMask.mevt0 |= VAYU_IPU1_WUGEN_INT_MASK0;
+        wugenEvtMask.mevt1 |= VAYU_IPU1_WUGEN_INT_MASK1;
+    }
+#endif
+    IpcPower_setWugen(&wugenEvtMask);
 }
 
 /*
index bf3cd8553b903b21840a372393f1f430bf09f56d..46b769d98de86df3999ab4592a7f595a552cd80a 100644 (file)
@@ -78,6 +78,16 @@ typedef enum IpcPower_Event {
  */
 typedef Void (*IpcPower_CallbackFuncPtr)(Int event, Ptr data);
 
+/*!
+ *  @brief  Type representing OMAP's WUGEN_MEVT[0|1] registers
+ *
+ *  For APIs IpcPower_getWugenEvtMask() and IpcPower_setWugenEvtMask()
+ */
+typedef struct IpcPower_WugenEvtMask {
+    UInt32 mevt0;
+    UInt32 mevt1;
+} IpcPower_WugenEvtMask;
+
 /* =============================================================================
  *  IpcPower Functions:
  * =============================================================================
@@ -163,6 +173,29 @@ Int IpcPower_registerCallback(Int event, IpcPower_CallbackFuncPtr fxn,
  */
 Int IpcPower_unregisterCallback(Int event, IpcPower_CallbackFuncPtr fxn);
 
+/*!
+ *  @brief      Retrieve current WUGEN mask used for suspend
+ *
+ *  @param[in]  mask  Pointer to structure for holding WUGEN event mask
+ *
+ *  @sa         IpcPower_suspend, IpcPower_setWugenEvtMask
+ */
+Void IpcPower_getWugenEvtMask(IpcPower_WugenEvtMask *mask);
+
+/*!
+ *  @brief      Set WUGEN mask used for suspend
+ *
+ *  The values in the passed structure are copied into the internal
+ *  WUGEN event mask. To achieve an ORing of certain bits in the mask,
+ *  first retrieve the current mask with IpcPower_getWugenEvtMask() and
+ *  then OR in the bits you want to enable.
+ *
+ *  @param[in]  mask  Pointer to WUGEN event mask structure
+ *
+ *  @sa         IpcPower_suspend, IpcPower_getWugenEvtMask
+ */
+Void IpcPower_setWugenEvtMask(IpcPower_WugenEvtMask *mask);
+
 #if defined (__cplusplus)
 }
 #endif /* defined (__cplusplus) */
index 3edd5962f014b3bed8320b6a24839aebee867b7e..c41d47341f30a85bf18ed8733ba495fb90e3f389 100644 (file)
@@ -52,20 +52,46 @@ extern "C" {
 #define MIRQ38_SHIFT                    6
 #define MIRQ39_SHIFT                    7
 
+/*
+ * First 16 interrupts are internal interrupts only and do not
+ * have WUGEN bits, and a WUGEN event register can accomodate
+ * 32 interrupts, with one per bit. So IRQs 17 to 48 are programmed
+ * in EVT0 register and IRQs 49 to 80 are programmed in EVT0
+ * register.
+ */
+#define MIRQ_SHIFT(irq)                 (((irq) - 16) % 32)
+
+#define MBX_INT                         50
+#define GPT3_INT                        53
+#define GPT4_INT                        54
+#define GPT9_INT                        55
+#define GPT11_INT                       56
+#define MBX6_U1_INT                     66
+
 #define WUGEN_MAILBOX_BIT               (1 << MIRQ34_SHIFT)
 #define WUGEN_GPT3_BIT                  (1 << MIRQ37_SHIFT)
 #define WUGEN_GPT4_BIT                  (1 << MIRQ38_SHIFT)
 #define WUGEN_GPT9_BIT                  (1 << MIRQ39_SHIFT)
 
+#define WUGEN_GPT11_BIT                 (1 << MIRQ_SHIFT(GPT11_INT))
+#define WUGEN_MBX6_U1_BIT               (1 << MIRQ_SHIFT(MBX6_U1_INT))
+
 /* Wake-up masks for interrupts 00-31 */
 #define WUGEN_MEVT0                     0x4000100C
 /* Wake-up masks for interrupts 32-63 */
 #define WUGEN_MEVT1                     0x40001010
 
 /* Enable Mailbox, GPT3, and GPT4 interrupts as Wakeup sources */
-#define WUGEN_INT_MASK                  (WUGEN_MAILBOX_BIT | \
+#define OMAP_IPU_WUGEN_INT_MASK0        0
+#define OMAP_IPU_WUGEN_INT_MASK1        (WUGEN_MAILBOX_BIT | \
                                          WUGEN_GPT3_BIT    | \
                                          WUGEN_GPT4_BIT)
+#define VAYU_IPU2_WUGEN_INT_MASK0       0
+#define VAYU_IPU2_WUGEN_INT_MASK1       (WUGEN_GPT3_BIT | \
+                                         WUGEN_MBX6_U1_BIT)
+#define VAYU_IPU1_WUGEN_INT_MASK0       0
+#define VAYU_IPU1_WUGEN_INT_MASK1       (WUGEN_GPT11_BIT | \
+                                         WUGEN_MBX6_U1_BIT)
 
 #define M3_SCR_REG                      0xE000ED10
 
index 4d04473a3f709698dc8ede5eff412dc29ae31d5e..948138010f7a3eba2300b4ec505c8187b8a76d24 100644 (file)
@@ -64,6 +64,16 @@ libArray.push(
             defs: " -DSMP"
         },
         isas: [ "v7M", "v7M4" ],
+        devices: [
+            {
+                name: "_omap5",
+                defs: " -DOMAP5",
+            },
+            {
+                name: "_vayu",
+                defs: " -DVAYU",
+            },
+        ],
     }
 );
 
@@ -99,20 +109,33 @@ for (var i = 0; i < libArray.length; i++) {
         /* ==== loop over all profiles ==== */
         for (var profile in targ.profiles) {
 
-            /* name = lib/profile/name.a+suffix */
-            var name = "lib/" + profile + "/" + lib.name;
+            var devices = "devices" in lib ? lib.devices
+                                           : [{name: "", defs: ""}];
+
+            for (d = 0; d < devices.length; d++) {
+
+                /* name = lib/profile/name_device.a+suffix */
+                var name = "lib/" + profile + "/" + lib.name + devices[d].name;
 
-            /* pass along library attributes specified in library array */
-            var libAttrs = "libAttrs" in lib ? lib.libAttrs : {};
+                /* pass along library attributes specified in library array */
+                var libAttrs = {};
 
-            /* must set profile explicitly */
-            libAttrs.profile = profile;
+                if ("libAttrs" in lib) {
+                    libAttrs.defs = lib.libAttrs.defs + devices[d].defs;
+                }
+                else {
+                    libAttrs.defs = devices[d].defs;
+                }
 
-            /* build the library */
-            var library = Pkg.addLibrary(name, targ, libAttrs);
+                /* must set profile explicitly */
+                libAttrs.profile = profile;
 
-            /* add the source files */
-            library.addObjects(lib.sources);
+                /* build the library */
+                var library = Pkg.addLibrary(name, targ, libAttrs);
+
+                /* add the source files */
+                library.addObjects(lib.sources);
+            }
         }
     }
 }
index 5dd079054d478950fdbfd67d48812e9bd8831fa4..e31e96fb7979a46756099dd4b23b87ea1fda5d60 100644 (file)
@@ -88,6 +88,8 @@ function getLibs(prog)
     var libAry = [];
     var profile = this.profile;
     var smp = "";
+    var device = prog.cpu.deviceName;
+    var platform = "";
 
     suffix = prog.build.target.findSuffix(this);
     if (suffix == null) {
@@ -98,13 +100,28 @@ function getLibs(prog)
         smp = "_smp";
     }
 
+    switch (device) {
+        case "OMAP5430":
+            platform = "_omap5";
+            break;
+
+        case "Vayu":
+        case "DRA7XX":
+            platform = "_vayu";
+            break;
+
+        default:
+            throw ("Unspported device: " + device);
+            return "";  /* nothing to contribute */
+    }
+
     /* make sure the library exists, else fallback to a built library */
-    file = "lib/" + profile + "/ti.pm" + smp + ".a" + suffix;
+    file = "lib/" + profile + "/ti.pm" + smp + platform + ".a" + suffix;
     if (java.io.File(this.packageBase + file).exists()) {
         libAry.push(file);
     }
     else {
-        file = "lib/release/ti.pm" + smp + ".a" + suffix;
+        file = "lib/release/ti.pm" + smp + platform + ".a" + suffix;
         if (java.io.File(this.packageBase + file).exists()) {
             libAry.push(file);
         }