meta-agl-bsp: Update Beaglebone support for Kirkstone
authorScott Murray <scott.murray@konsulko.com>
Mon, 11 Apr 2022 15:07:56 +0000 (11:07 -0400)
committerScott Murray <scott.murray@konsulko.com>
Mon, 11 Apr 2022 15:07:56 +0000 (11:07 -0400)
Changes:
- Update machine template to point into new meta-ti-bsp layer in the
  meta-ti repository, and update the dynamic layer directory name to
  match.
- meta-ti currently does not have Weston 10.0.0 support, and testing
  confirms it will not build against the currently provided version
  of the SGX GPU driver, so disable using it for now.
- Even though the GPU driver is not being used ATM, the local patch
  for ti-sgx-ddk-km to handle AGL toolchain naming has been updated
  to ease testing meta-ti updates down the road.
- The Weston bbappend that had been based on meta-arago's has been
  removed for now.  A re-evaluation of what is needed locally will
  need to be done when TI have their Weston 10.0.0 support settled.

Bug-AGL: SPEC-3819

Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: Ie61cef722a643791970214710835423a21696694

15 files changed:
meta-agl-bsp/conf/include/agl_beaglebone.inc
meta-agl-bsp/meta-ti-bsp/.gitkeep [moved from meta-agl-bsp/meta-ti/.gitkeep with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend [moved from meta-agl-bsp/meta-ti/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km/0001-Add-support-for-AGL-toolchain.patch [moved from meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km/0001-Add-support-for-AGL-toolchain.patch with 70% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km_%.bbappend [moved from meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km_%.bbappend with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-graphics/libgles/ti-sgx-ddk-um/pvr.service [moved from meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um/pvr.service with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-graphics/libgles/ti-sgx-ddk-um_%.bbappend [moved from meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um_%.bbappend with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa-gl_%.bbappend [moved from meta-agl-bsp/meta-ti/recipes-graphics/mesa/mesa-gl_%.bbappend with 100% similarity]
meta-agl-bsp/meta-ti-bsp/recipes-kernel/linux/linux-ti-staging_%.bbappend [moved from meta-agl-bsp/meta-ti/recipes-kernel/linux/linux-ti-staging_%.bbappend with 100% similarity]
meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch [deleted file]
meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch [deleted file]
meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch [deleted file]
meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch [deleted file]
meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend [deleted file]
templates/machine/beaglebone/50_bblayers.conf.inc

index 6a515d2..292a544 100644 (file)
@@ -1,40 +1,27 @@
 # This config is for the beaglebone (inspired from the vayu config).
 
+# DEFAULTTUNE for cortex-a8
+DISTRO_FEATURES:append = " agl-medium-arm-compiler"
+
+WKS_FILE = "sdimage-bootpart-uuid.wks"
+
 #-------------------------------------------------
 ## Graphics section ##
 #-------------------------------------------------
 PACKAGES_GFX = "ti-sgx-ddk-km"
 IMAGE_INSTALL:append = " ${PACKAGES_GFX}"
 
+#  Enable Gfx Pkgs
+MACHINE_FEATURES:append = " gpu"
+BB_MULTI_PROVIDER_ALLOWED += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2 virtual/libgles3"
 
-# Enable Gfx Pkgs
-MACHINE_FEATURES:append = " sgx"
-BB_MULTI_PROVIDER_ALLOWED += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2"
-
-DEPENDS:remove = "virtual/libgl"
+# NOTE: SGX GPU driver use disabled until TI provides updated drivers
+#       that Weston 10.0.0 can be built against.
 
 # Preferred providers
-PREFERRED_PROVIDER_virtual/libgles1 = ""
-PREFERRED_PROVIDER_virtual/libgles2 = "ti-sgx-ddk-um"
-PREFERRED_PROVIDER_virtual/egl      = "ti-sgx-ddk-um"
-PREFERRED_PROVIDER_virtual/libgbm   = "ti-sgx-ddk-um"
-PREFERRED_PROVIDER_virtual/mesa     = "mesa-gl"
-
-#-------------------------------------------------
-## Multimedia section ##
-#-------------------------------------------------
-
-PREFERRED_PROVIDER_virtual/kernel  = "linux-ti-staging"
-PREFERRED_VERSION_virtual/kernel  = "4.9"
-
-# DEFAULTTUNE for cortex-a8
-DISTRO_FEATURES:append = " agl-medium-arm-compiler"
-
-SECURITY_CFLAGS:pn-mozjs = ""
-SECURITY_LDFLAGS:pn-mozjs = ""
-SECURITY_CFLAGS:pn-gpm = ""
-SECURITY_LDFLAGS:pn-gpm = ""
-SECURITY_CFLAGS:pn-libatasmart = ""
-SECURITY_LDFLAGS:pn-libatasmart = ""
-
-WKS_FILE = "sdimage-bootpart-uuid.wks"
+#PREFERRED_PROVIDER_virtual/libgles1 = ""
+#PREFERRED_PROVIDER_virtual/libgles2 = "ti-sgx-ddk-um"
+#PREFERRED_PROVIDER_virtual/libgles3 = "ti-sgx-ddk-um"
+#PREFERRED_PROVIDER_virtual/egl      = "ti-sgx-ddk-um"
+#PREFERRED_PROVIDER_virtual/libgbm   = "ti-sgx-ddk-um"
+#PREFERRED_PROVIDER_virtual/mesa     = "mesa-gl"
@@ -1,4 +1,4 @@
-From 3bc2dac0d32038e82d9fec17bee5b66a73c2937c Mon Sep 17 00:00:00 2001
+From 630046ad76e14d28bd6b0728632e4f43b0916c22 Mon Sep 17 00:00:00 2001
 From: Paul Barker <paul.barker@sancloud.com>
 Date: Tue, 30 Nov 2021 16:48:58 +0000
 Subject: [PATCH] Add support for AGL toolchain
@@ -8,23 +8,25 @@ to make sure our toolchain is matched against this and not
 arm-linux-gnueabi.
 
 Signed-off-by: Paul Barker <paul.barker@sancloud.com>
+[Updated for 1.17.4948957/k5.10]
+Signed-off-by: Scott Murray <scott.murrary@konsulko.com>
 ---
  eurasia_km/eurasiacon/build/linux2/config/compiler.mk | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/eurasia_km/eurasiacon/build/linux2/config/compiler.mk b/eurasia_km/eurasiacon/build/linux2/config/compiler.mk
-index 97b90e2bc8ce..4e4a6d9c737f 100644
+index 1b5f090..6719dc2 100644
 --- a/eurasia_km/eurasiacon/build/linux2/config/compiler.mk
 +++ b/eurasia_km/eurasiacon/build/linux2/config/compiler.mk
 @@ -68,7 +68,7 @@ define calculate-compiler-preferred-target
    ifneq ($$(filter aarch64-%,$$($(1)_compiler_preferred_target)),)
     $(1)_compiler_preferred_target := aarch64-linux-gnu
    endif
--  ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi arm-poky-linux-gnueabi,$$($(1)_compiler_preferred_target)),)
-+  ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi arm-poky-linux-gnueabi arm-agl-linux-gnueabi,$$($(1)_compiler_preferred_target)),)
+-  ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi arm-poky-linux-gnueabi arm-yoe-linux-gnueabi arm-oe-linux-musleabi arm-poky-linux-musleabi arm-yoe-linux-musleabi,$$($(1)_compiler_preferred_target)),)
++  ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi arm-poky-linux-gnueabi arm-yoe-linux-gnueabi arm-agl-linux-gnueabi arm-oe-linux-musleabi arm-poky-linux-musleabi arm-yoe-linux-musleabi,$$($(1)_compiler_preferred_target)),)
     $(1)_compiler_preferred_target := arm-linux-gnueabihf
    endif
    ifneq ($$(filter arm-%-gnueabi armv7a-cros-linux-gnueabi armv7hl-redhat-linux-gnueabi,$$($(1)_compiler_preferred_target)),)
 -- 
-2.31.1
+2.30.2
 
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch
deleted file mode 100644 (file)
index 4268b7d..0000000
+++ /dev/null
@@ -1,3570 +0,0 @@
-From 7830118ecb980766f4a6e3997769d7ae326bee77 Mon Sep 17 00:00:00 2001
-From: Karthik Ramanan <a0393906@ti.com>
-Date: Fri, 3 Jun 2016 18:32:50 +0530
-Subject: [PATCH] Add soc performance monitor utilites
-
-Signed-off-by: Karthik Ramanan <a0393906@ti.com>
----
- Makefile.am                       |   17 +-
- clients/Dra7xx_ddrstat_speed.c    |  494 +++++++++++++
- clients/soc_performance_monitor.c |  630 ++++++++++++++++
- clients/soc_performance_monitor.h |   40 ++
- clients/statcoll.c                | 1433 +++++++++++++++++++++++++++++++++++++
- clients/statcoll.h                |  152 ++++
- clients/statcoll_gui.h            |  101 +++
- clients/time_bar_graph.c          |  515 +++++++++++++
- clients/time_bar_graph.h          |   93 +++
- 10 files changed, 4873 insertions(+), 1 deletion(-)
- create mode 100644 clients/Dra7xx_ddrstat_speed.c
- create mode 100644 clients/soc_performance_monitor.c
- create mode 100644 clients/soc_performance_monitor.h
- create mode 100644 clients/statcoll.c
- create mode 100644 clients/statcoll.h
- create mode 100644 clients/statcoll_gui.h
- create mode 100644 clients/time_bar_graph.c
- create mode 100644 clients/time_bar_graph.h
-
-diff --git a/Makefile.am b/Makefile.am
-index 62719c9..55aed6d 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -432,7 +432,9 @@ demo_clients =                                     \
-       weston-fullscreen                       \
-       weston-stacking                         \
-       weston-calibrator                       \
--      weston-scaler
-+      weston-scaler                           \
-+      soc-performance-monitor                 \
-+      soc-ddr-bw-visualizer
- if INSTALL_DEMO_CLIENTS
- bin_PROGRAMS += $(demo_clients)
-@@ -570,6 +572,19 @@ weston_image_SOURCES = clients/image.c
- weston_image_LDADD = libtoytoolkit.la
- weston_image_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
-+noinst_LTLIBRARIES += libtimebargraph.la
-+libtimebargraph_la_SOURCES = clients/time_bar_graph.c clients/time_bar_graph.h
-+libtimebargraph_la_LIBADD = libtoytoolkit.la
-+libtimebargraph_la_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_EGL_CFLAGS)
-+
-+soc_performance_monitor_SOURCES = clients/soc_performance_monitor.c clients/soc_performance_monitor.h 
-+soc_performance_monitor_LDADD = libtoytoolkit.la libtimebargraph.la
-+soc_performance__CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
-+
-+soc_ddr_bw_visualizer_SOURCES = clients/statcoll.c clients/Dra7xx_ddrstat_speed.c  clients/statcoll.h clients/statcoll_gui.h 
-+soc_ddr_bw_visualizer_LDADD = libtoytoolkit.la libtimebargraph.la 
-+soc_ddr_bw_visualizer__CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
-+
- weston_cliptest_SOURCES =                             \
-       clients/cliptest.c                              \
-       src/vertex-clipping.c                           \
-diff --git a/clients/Dra7xx_ddrstat_speed.c b/clients/Dra7xx_ddrstat_speed.c
-new file mode 100644
-index 0000000..af06733
---- /dev/null
-+++ b/clients/Dra7xx_ddrstat_speed.c
-@@ -0,0 +1,494 @@
-+/*
-+ * Copyright (C) 2015 Texas Instruments
-+ * Author: Karthik Ramanan <karthik.ramanan@ti.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published by
-+ * the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program.  If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <stdint.h>
-+#include <string.h>
-+#include <sys/mman.h>
-+#include <sys/time.h>
-+#include <unistd.h>
-+#include <fcntl.h>
-+#include "statcoll.h"
-+
-+#define PAGE_SIZE 4096
-+
-+#define EMIF1_BASE 0x4c000000
-+#define EMIF2_BASE 0x4d000000
-+
-+#define EMIF_PERF_CNT_1     0x80
-+#define EMIF_PERF_CNT_2     0x84
-+#define EMIF_PERF_CNT_CFG   0x88
-+#define EMIF_PERF_CNT_TIM   0x90
-+
-+static unsigned
-+tv_diff(struct timeval *tv1, struct timeval *tv2)
-+{
-+    return (tv2->tv_sec - tv1->tv_sec) * 1000000 +
-+        (tv2->tv_usec - tv1->tv_usec);
-+}
-+
-+
-+struct emif_perf {
-+    int code;
-+    const char *name;
-+};
-+
-+static const struct emif_perf emif_perf_tab[] = {
-+    {  0, "access"     },
-+    {  1, "activate"   },
-+    {  2, "read"       },
-+    {  3, "write"      },
-+    {  4, "fifo_cmd"   },
-+    {  5, "fifo_write" },
-+    {  6, "fifo_read"  },
-+    {  7, "fifo_ret"   },
-+    {  8, "prio"       },
-+    {  9, "cmd_pend"   },
-+    { 10, "data"       },
-+};
-+
-+static void *emif1, *emif2;
-+static int BANDWIDTH=0;
-+static int DELAY = 1;
-+static int EMIF_PERF_CFG1 = 9;
-+static int EMIF_PERF_CFG2 = 10;
-+
-+
-+static int STATCOLL=0;
-+static int TOTAL_TIME;
-+static int INTERVAL_US;
-+
-+struct timeval t1, t2;
-+
-+FILE* outfile;
-+struct emif_stats {
-+    uint32_t cycles;
-+    uint32_t cnt1;
-+    uint32_t cnt2;
-+};
-+
-+static struct emif_stats emif1_start, emif1_end;
-+static struct emif_stats emif2_start, emif2_end;
-+
-+static void *emif_init(int fd, unsigned base)
-+{
-+    void *mem =
-+        mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, base);
-+    volatile uint32_t *emif = mem,temp;
-+    
-+   if (mem == MAP_FAILED){
-+        return NULL;
-+    }
-+
-+    emif[EMIF_PERF_CNT_CFG>>2] = EMIF_PERF_CFG2 << 16 | EMIF_PERF_CFG1;
-+   
-+    return mem;
-+}
-+
-+static void emif_read(volatile uint32_t *emif, struct emif_stats *st)
-+{
-+    st->cycles = emif[EMIF_PERF_CNT_TIM>>2];
-+    st->cnt1   = emif[EMIF_PERF_CNT_1>>2];
-+    st->cnt2   = emif[EMIF_PERF_CNT_2>>2];
-+}
-+
-+static void emif_print(const char *tag, struct emif_stats *st1,
-+                       struct emif_stats *st2)
-+{
-+    uint32_t cycles = st2->cycles - st1->cycles;
-+    uint32_t cnt1   = st2->cnt1   - st1->cnt1;
-+    uint32_t cnt2   = st2->cnt2   - st1->cnt2;
-+    printf("%s %s %2llu%% %s %2llu%%", tag,
-+           emif_perf_tab[EMIF_PERF_CFG1].name, 100ull*cnt1/cycles,
-+           emif_perf_tab[EMIF_PERF_CFG2].name, 100ull*cnt2/cycles);
-+    fprintf(outfile,"%s%s= %2llu,%s%s= %2llu,", 
-+           tag, emif_perf_tab[EMIF_PERF_CFG1].name, 100ull*cnt1/cycles,
-+           tag, emif_perf_tab[EMIF_PERF_CFG2].name, 100ull*cnt2/cycles);
-+}
-+
-+static int perf_init(void)
-+{
-+    int fd = open("/dev/mem", O_RDWR);
-+    int err = 0;
-+
-+    if (fd == -1){
-+       printf("error fd=open() \n");     
-+       return -1;
-+    }
-+    emif1 = emif_init(fd, EMIF1_BASE);
-+    emif2 = emif_init(fd, EMIF2_BASE);
-+
-+    if (!emif1 || !emif2){
-+         printf("error if (!emif1 || !emif2) \n");       
-+         err = -1;
-+    }
-+
-+    close(fd);
-+    return err;
-+}
-+
-+static void perf_start(void)
-+{
-+    if (emif1) {
-+        emif_read(emif1, &emif1_start);
-+        emif_read(emif2, &emif2_start);
-+    }
-+}
-+
-+static void perf_stop(void)
-+{
-+    if (emif1) {
-+        emif_read(emif1, &emif1_end);
-+        emif_read(emif2, &emif2_end);
-+    }
-+}
-+
-+static void perf_print(void)
-+{
-+    if (emif1) {
-+        emif_print("EMIF1", &emif1_start, &emif1_end);
-+        printf("\t");
-+        emif_print("EMIF2", &emif2_start, &emif2_end);
-+        printf("\r");
-+      fprintf(outfile, "\n");
-+      fflush(outfile);
-+      fflush(stdout);
-+    }
-+}
-+
-+static void perf_close(void)
-+{
-+    if (emif1) munmap(emif1, PAGE_SIZE);
-+    if (emif2) munmap(emif2, PAGE_SIZE);
-+}
-+
-+static int get_cfg(const char *name, int def)
-+{
-+    char *end;
-+    int n = strtol(name, &end, 0);
-+    int i;
-+
-+    if (!*end)
-+        return n;
-+
-+    for (i = 0; i < sizeof(emif_perf_tab)/sizeof(emif_perf_tab[0]); i++)
-+        if (!strcmp(name, emif_perf_tab[i].name))
-+            return emif_perf_tab[i].code;
-+
-+    return def;
-+}
-+
-+
-+unsigned int emif_freq()
-+{
-+    volatile unsigned *tim1;
-+    unsigned v1, v2;
-+    int fd;
-+    
-+    /*calculation EMIF frequency 
-+      EMIF_PERF_CNT_TIM = \n32-bit counter that 
-+      continuously counts number for 
-+      EMIF_FCLK clock cycles elapsed 
-+      after EMIFis brought out of reset*/
-+
-+    fd = open("/dev/mem", O_RDONLY);
-+    if (fd == -1) {
-+        perror("/dev/mem");
-+        return 1;
-+    }
-+
-+    void *mem =
-+    mem = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, EMIF1_BASE);
-+    if (mem == MAP_FAILED) {
-+        perror("mmap");
-+        exit(1);
-+    }
-+
-+    tim1 = (unsigned *)((char*)mem + EMIF_PERF_CNT_TIM);
-+
-+    v1 = *tim1;
-+    gettimeofday(&t1, NULL);
-+    sleep(2);
-+    v2 = *tim1;
-+    gettimeofday(&t2, NULL);
-+    
-+    munmap(mem, PAGE_SIZE);
-+    close(fd);
-+
-+    return (v2 - v1) / tv_diff(&t1, &t2);
-+
-+}
-+
-+
-+char config_file_path[100];
-+char keylist[][50] = {
-+      "DELAY",
-+      "EMIF_PERF_CFG1",
-+      "EMIF_PERF_CFG2",
-+      "BANDWIDTH",
-+      "STATCOLL",
-+      "TOTAL_TIME",
-+      "INTERVAL_US",
-+      "INITIATORS",
-+};
-+
-+char line[512], *p;
-+char tokens[6][512];
-+int temp, flag = 0;
-+char *keyvalue, *pair;
-+char key[100];
-+int linecount=0;
-+
-+
-+int debug=0;
-+
-+void print_valid_options(void)
-+{
-+   int i;
-+        printf("Invalid key found\n");
-+      printf("Supported keys are :\n");
-+      for(i=0; i<sizeof(keylist)/sizeof(keylist[0]); i++)
-+              printf("\t\t %s\n", keylist[i]);
-+
-+}
-+int validatekey(char *ptr)
-+{
-+      int i;
-+      for(i=0; i<sizeof(keylist)/sizeof(keylist[0]); i++)
-+              if(strcmp(ptr, keylist[i]) == 0)
-+                      return 0;
-+
-+      return 1;
-+}
-+
-+void add_key_value(char *key, int value)
-+{
-+      printd("%s", "Inside add_key_value\n");
-+      
-+      if(strcmp(key, "BANDWIDTH") == 0) {
-+              BANDWIDTH = value;
-+              return;
-+      }
-+      if(strcmp(key, "STATCOLL") == 0) {
-+              STATCOLL = value;
-+              return;
-+      }
-+      else
-+              printd("%s", "********** UNKNOWN**********");
-+
-+      if(BANDWIDTH == 1) {
-+              if(strcmp(key, "DELAY") == 0)
-+                      DELAY = value;
-+              else if(strcmp(key, "EMIF_PERF_CFG1") == 0)
-+                      EMIF_PERF_CFG1 = value;
-+              else if(strcmp(key, "EMIF_PERF_CFG2") == 0)
-+                      EMIF_PERF_CFG2 = value;
-+      }
-+      else
-+              printf("NOTE: BANDWIDTH is not enabled, ignoring %s\n", key);
-+
-+
-+        if(STATCOLL == 1) {
-+              if(strcmp(key, "INTERVAL_US") == 0)
-+                      INTERVAL_US = value;
-+              else if(strcmp(key, "TOTAL_TIME") == 0)
-+                      TOTAL_TIME = value;
-+        }
-+      else
-+              printf("NOTE: STATCOLL is not enabled, ignoring %s\n", key);
-+}
-+
-+void bandwidth_usage() {
-+
-+    printf("#########################################################\n##\n"
-+
-+           "##  usage    : ./Dra7xx_ddrstat   <DELAY>  <EMIF_PERF_CFG1>  <EMIF_PERF_CFG2> \n"
-+           "##  default  :                    DELAY=1  EMIF_PERF_CFG1=9  EMIF_PERF_CFG2=10\n" 
-+           "##  option   : for EMIF_PERF_CFG1 and EMIF_PERF_CFG2\n"
-+           "##             0  -> access,\n"  
-+           "##             1  -> activate,\n"
-+           "##             2  -> read,\n"
-+           "##             3  -> write,\n"
-+           "##             4  -> fifo_cmd,\n"
-+           "##             5  -> fifo_write,\n"
-+           "##             6  -> fifo_read,\n"
-+           "##             7  -> fifo_ret,\n"
-+           "##             8  -> prio,\n"
-+           "##             9  -> cmd_pend,\n"
-+           "##             10 -> data    \n##\n"
-+
-+           "##  EMIF frq : %d MHz\n\n", emif_freq() );
-+}
-+
-+
-+int main(int argc, char **argv)
-+{
-+    int option;
-+    FILE *fp;
-+    int i;
-+    int xpos = 600, ypos = 40;
-+    
-+    
-+    /* Read config file */
-+    /* Initialize this to turn off verbosity of getopt */
-+    opterr = 0;
-+
-+//    while ((option = getopt (argc, argv, "df:")) != -1)
-+    while ((option = getopt (argc, argv, "dx:y:")) != -1)
-+    {
-+          switch(option)
-+          {
-+#if 0
-+                  case 'f':
-+                          strcpy(config_file_path, optarg);
-+                          break;
-+#endif
-+                  case 'd':
-+                          debug=1;
-+                          break;
-+                  case 'x':
-+                          xpos=atoi(optarg);
-+                          break;
-+                  case 'y':
-+                          ypos=atoi(optarg);
-+                          break;
-+                  
-+                  default:
-+                          printf("Invalid option.. Exiting\n");
-+                          exit(0);
-+          }
-+    }
-+
-+    printf("xpos = %d, ypos = %d\n", xpos, ypos);
-+
-+    strcpy(config_file_path,"config.ini");
-+    fp = fopen(config_file_path, "r");
-+    if (fp == NULL) {
-+          fprintf(stderr, "couldn't open the specified file\n");
-+          return -1;
-+    }
-+
-+    while (fgets(line, sizeof line, fp)) {
-+          printd("Line is = %s", line);
-+
-+          if (line[0] == '#' || line[0] == '\n') {
-+                  continue;
-+          }
-+
-+          memset(tokens, 0, sizeof(tokens));
-+          i = 0;
-+
-+          pair = strtok (line," ,");
-+          while (pair != NULL)
-+          {
-+                  printd ("\tPair is = %s\n",pair);
-+                  strcpy(tokens[i++], pair);
-+                  pair = strtok (NULL, " ,.-");
-+          }
-+
-+          for(temp=0; temp< i; temp++)
-+          {
-+                  printd("Line %d: %s\n", temp, tokens[temp]);
-+
-+                  keyvalue = strtok (tokens[temp]," =");
-+                  while (keyvalue != NULL)
-+                  {
-+                          if(flag == 0)
-+                          {
-+                                  if(validatekey(keyvalue))
-+                                  {
-+                                            print_valid_options();
-+                                          exit(0);
-+                                  }
-+                                  strcpy(key, keyvalue);
-+                                  printd ("\tKey is = %s\n",key);
-+                                  flag++;
-+                          }
-+                          else
-+                          {
-+                                  printd ("\tValue is = %s",keyvalue);
-+                                  printd (" (%d)\n", atoi(keyvalue));
-+                                  add_key_value(key, atoi(keyvalue));
-+                                  flag = 0;
-+                          }
-+                          keyvalue = strtok (NULL, " =");
-+                  }
-+          }
-+
-+
-+
-+          linecount++;
-+          printd("%s", "------------------- \n");
-+
-+    }
-+
-+    fclose(fp);
-+
-+    printf("\n\nCOMPLETED: Parsing of the user specified parameters.. \n \
-+                \nConfiguring device now.. \n\n");
-+    if(BANDWIDTH == 1) {
-+          bandwidth_usage();
-+          if (DELAY <= 0)
-+                  DELAY = 1;
-+
-+          if (perf_init()){
-+                  printf("perf_init return non zero \n");
-+                  return 1;
-+          }
-+
-+          outfile = fopen("emif-performance.csv", "w+");
-+          if (!outfile) {
-+                  printf("\n Error opening file");
-+          }
-+          for (;;) {
-+                  perf_start();
-+                  sleep(DELAY);
-+                  perf_stop();
-+                  perf_print();
-+          }
-+
-+          fclose(outfile);
-+          perf_close();
-+          return 0;
-+    }
-+
-+    if(STATCOLL == 1) {
-+          printf("STATISTICS COLLECTOR option chosen\n");
-+            printf("------------------------------------------------\n\n");
-+          fp = fopen("initiators.cfg", "r");
-+          if (fp == NULL) {
-+                  fprintf(stderr, "couldn't open the specified file initiators.cfg'\n");
-+                  return -1;
-+          }
-+
-+          int i=0;
-+            char list[100][50];
-+          memset(list, sizeof(list), 0);
-+          while (fgets(line, sizeof line, fp)) {
-+                  printf("Line is = %s", line);
-+                  /* Slightly strange way to chop off the \n character */
-+                  strtok(line, "\n");
-+                  strcpy(list[i++], line);
-+          }
-+          fclose(fp);
-+
-+          statcoll_start(TOTAL_TIME, INTERVAL_US, list, xpos, ypos);
-+    }
-+
-+}
-+
-diff --git a/clients/soc_performance_monitor.c b/clients/soc_performance_monitor.c
-new file mode 100644
-index 0000000..5d1db32
---- /dev/null
-+++ b/clients/soc_performance_monitor.c
-@@ -0,0 +1,630 @@
-+/*
-+ * Copyright (C) 2016 Texas Instruments
-+ * Author: Karthik Ramanan <karthik.ramanan@ti.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published by
-+ * the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program.  If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdint.h>
-+#include <signal.h>
-+#include <time.h>
-+#include <math.h>
-+#include <unistd.h>
-+#include <sys/time.h>
-+#include <pthread.h>
-+#include <errno.h>
-+#include <unistd.h>
-+#include <fcntl.h>
-+#include <sys/stat.h>
-+
-+#include "time_bar_graph.h"
-+
-+#include "soc_performance_monitor.h"
-+
-+static int debug=0;
-+
-+static char readfifo[100]; 
-+static int MAX_WIDTH=1920;
-+static int MAX_HEIGHT=1080;
-+static int x_pos=0;
-+static int y_pos=40;
-+
-+void *ctx;
-+struct time_graph_create_params tg_p;
-+struct bar_graph_create_params bg_p;
-+
-+static int cpu_load_offset = 0;
-+static int total_cpu_load_items = 0;
-+static int total_elements = 0;
-+
-+struct _bar_graph_y_config *y_cfg;
-+struct _text_config *t_cfg;
-+char *tg_text[100]; 
-+char *bg_text[100]; 
-+
-+
-+int command_handler(int command, double *y, char **text)
-+{
-+      static int fd;
-+      char buf[MAX_BUF];
-+      int i, bytes, offset;
-+
-+      switch(command)
-+      {
-+              case OPEN:
-+                      fd = open(readfifo, O_RDONLY|O_NONBLOCK);
-+                      break;
-+
-+              case READ:
-+
-+                      /* open, read, and display the message from the FIFO */
-+                      bytes=read(fd, buf, MAX_BUF);
-+                       buf[bytes]='\0';
-+                      if(bytes > 0) 
-+                      {
-+                              char command[100];
-+                              char string[100];
-+                              sscanf(buf, "%s %s", command, string);
-+                              printd("Received %s\n", buf);
-+                              if(strcmp(command, "TABLE:") == 0) 
-+                              {
-+                                      char field[100], value[100], unit[100];
-+                                      sscanf(buf, "%s %s %s %s", command, field, value, unit);
-+                                      for(i=0; i<cpu_load_offset; i++) {
-+                                              if(strcmp(text[i*2], field) == 0) {
-+                                                      printd("Updating value(%s), unit(%s)\n", value, unit);
-+                                                      sprintf(text[i*2+1], "%s %s", value, unit);
-+                                              }
-+                                      }
-+                              }
-+                              else if(strcmp(command, "CPULOAD:") == 0) 
-+                              {
-+                                      char field[100], value[100];
-+
-+                                      sscanf(buf, "%s %s %s", command, field, value);
-+
-+                                      for(i=cpu_load_offset; i<cpu_load_offset+total_cpu_load_items; i++) {
-+                                              if(strcmp(text[i*2], field) == 0) {
-+                                                      if(strlen(value) <= 2) {
-+                                                              y[i*2+1] = atoi(value)/100.0;
-+                                                              sprintf(text[i*2+1], " %02s%s", value,"%");
-+                                                              printd("CPULOAD: Updating %s with %s\n", field, value);
-+                                                      }
-+                                                      else {
-+                                                              printf("Ignoring value: %s\n", value);
-+                                                      }
-+                                              }
-+                                      }
-+                              }
-+                              else if(strcmp(command, "MOVE:") == 0) 
-+                              {
-+                                      char value[100];
-+                                      printd("Received MOVE command : %s\n", buf);
-+                                      sscanf(string, "%s", value);
-+                                      sprintf(tg_p.title, "CPU Usage[@position-req=%sx%d]", value, y_pos);
-+                                      move_graph(ctx, &tg_p);
-+                              }
-+                              else
-+                              {
-+                                      printf("ERROR: Received unexpected data from FIFO - \" %s \" \n", buf);
-+                              }
-+                              memset(buf, 0x0, sizeof(buf));
-+                      }
-+
-+                      break;
-+
-+              case CLOSE:
-+                      close(fd);
-+                      break;
-+      }
-+      return bytes;
-+}
-+
-+volatile sig_atomic_t sigtermed = 0;
-+
-+void my_signal_handler(int signum)
-+{
-+      if (signum == SIGTERM || signum == SIGINT) {
-+              sigtermed = 1;
-+      }
-+}
-+
-+int get_strings_in_section(char *string, char **output)
-+{
-+      FILE *fd;
-+      char line[512];
-+      int total_strings = 0;
-+      
-+      fd = fopen("soc_performance_monitor.cfg", "r");
-+      if(fd == NULL) {
-+              fprintf(stderr, "ERROR: Unable to open file soc_performance_monitor.cfg\n");
-+              fprintf(stderr, "       Please copy the file from /etc/visualization_scripts into current directory\n");
-+              exit(0);
-+      }
-+      
-+      while(fgets(line, sizeof line, fd)) {
-+          if(strstr(line, string)) {
-+              printf("\n-------------------------------------------------\n");
-+              printf("CONFIG FILE PARSE: Found section %s in line : %s\n", string, line);
-+              break;
-+          }
-+      }
-+
-+      while(fgets(line, sizeof line, fd)) {
-+          printd("Line is = %s", line);
-+
-+          if (line[0] == '#' || line[0] == '\n' || line[0] == '[') {
-+                  break;
-+          }
-+
-+          line[strlen(line) - 1] = '\0';
-+          strcpy(output[total_strings++], line);
-+          
-+      }
-+      fclose(fd);
-+
-+      return total_strings;
-+}
-+
-+
-+void fill_cpu_load_details(int start_offset, int end_offset, char **output, struct table_configuration *table_config)
-+{
-+      int i;
-+
-+      const int BL_START_X = table_config->BL_START_X;
-+      const int BL_START_Y = table_config->BL_START_Y;
-+      const int BAR_GAP = table_config->BAR_GAP;
-+      const int BAR_HEIGHT = table_config->BAR_HEIGHT;
-+      const int BAR_WIDTH = table_config->BAR_WIDTH;
-+      const int TR_START_X = table_config->TR_START_X;
-+      const int TR_START_Y = table_config->TR_START_Y;
-+      const int FONT_SIZE = table_config->FONT_SIZE;
-+      printf("Filling from %d to %d\n", start_offset, end_offset);
-+      cpu_load_offset = start_offset;
-+
-+      for(i=start_offset; i< end_offset-1; i++) {
-+              y_cfg[i*2].region.bottom_left.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              y_cfg[i*2].region.bottom_left.y = BL_START_Y;
-+              y_cfg[i*2].region.top_right.x = TR_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              y_cfg[i*2].region.top_right.y = TR_START_Y;
-+              y_cfg[i*2].line_color.r = 1.0;
-+              y_cfg[i*2].line_color.g = 1.0;
-+              y_cfg[i*2].line_color.b = 1.0;
-+              y_cfg[i*2].line_color.a = 1.0;
-+              y_cfg[i*2].fill_color.r = 0.0;
-+              y_cfg[i*2].fill_color.g = 0.0;
-+              y_cfg[i*2].fill_color.b = 1.0;
-+              y_cfg[i*2].fill_color.a = 0.7;
-+
-+              y_cfg[i*2+1].region.bottom_left.x = BL_START_X +(i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              y_cfg[i*2+1].region.bottom_left.y = BL_START_Y;
-+              y_cfg[i*2+1].region.top_right.x = TR_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              y_cfg[i*2+1].region.top_right.y = TR_START_Y;
-+              y_cfg[i*2+1].line_color.r = 1.0;
-+              y_cfg[i*2+1].line_color.g = 1.0;
-+              y_cfg[i*2+1].line_color.b = 1.0;
-+              y_cfg[i*2+1].line_color.a = 1.0;
-+              y_cfg[i*2+1].fill_color.r = 1.0;
-+              y_cfg[i*2+1].fill_color.g = 0.0;
-+              y_cfg[i*2+1].fill_color.b = 0.0;
-+              y_cfg[i*2+1].fill_color.a = 1.0;
-+
-+      
-+              t_cfg[i*2].color.r = 1.0;
-+              t_cfg[i*2].color.g = 1.0;
-+              t_cfg[i*2].color.b = 1.0;
-+              t_cfg[i*2].color.a = 1.0;
-+              t_cfg[i*2].at.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              t_cfg[i*2].at.y = BL_START_Y + FONT_SIZE;
-+              t_cfg[i*2].fontsize = FONT_SIZE;
-+
-+              t_cfg[i*2+1].color.r = 1.0;
-+              t_cfg[i*2+1].color.g = 1.0;
-+              t_cfg[i*2+1].color.b = 1.0;
-+              t_cfg[i*2+1].color.a = 1.0;
-+              t_cfg[i*2+1].at.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH);
-+              t_cfg[i*2+1].at.y = BL_START_Y - BAR_HEIGHT -  FONT_SIZE;
-+              t_cfg[i*2+1].fontsize = FONT_SIZE;
-+
-+              strcpy(bg_text[i*2], output[i - start_offset]);
-+              strcpy(bg_text[i*2+1], "0%");
-+      }
-+
-+      t_cfg[(end_offset-1)*2].color.r = 0.0;
-+      t_cfg[(end_offset-1)*2].color.g = 1.0;
-+      t_cfg[(end_offset-1)*2].color.b = 1.0;
-+      t_cfg[(end_offset-1)*2].color.a = 1.0;
-+      t_cfg[(end_offset-1)*2].at.x = BL_START_X + 80;
-+      t_cfg[(end_offset-1)*2].at.y = TR_START_Y - 40;
-+      t_cfg[(end_offset-1)*2].fontsize = FONT_SIZE + 3;
-+
-+      printd("Copying title string %s\n", output[end_offset - start_offset -1]);
-+      strcpy(bg_text[(end_offset-1)*2], output[end_offset - start_offset-1]);
-+}
-+
-+void fill_table_details(int start_offset, int end_offset, char **output, struct table_configuration *table_config)
-+{
-+      int i;
-+
-+      const int BL_START_X = table_config->BL_START_X;
-+      const int BL_START_Y = table_config->BL_START_Y;
-+      const int BAR_GAP = table_config->BAR_GAP;
-+      const int BAR_HEIGHT = table_config->BAR_HEIGHT;
-+      const int BAR_WIDTH = table_config->BAR_WIDTH;
-+      const int TR_START_X = table_config->TR_START_X;
-+      const int TR_START_Y = table_config->TR_START_Y;
-+      const int FONT_SIZE = table_config->FONT_SIZE;
-+      printf("Filling from %d to %d\n", start_offset, end_offset);
-+
-+       
-+        char tokenize[200];
-+      char tokens[10][100];
-+      char *pair, *key, *value;
-+      int k=0;
-+      char title[100], unit[100];
-+
-+      strcpy(tokenize, output[end_offset - start_offset - 1]);
-+      memset(tokens, 0, sizeof(tokens));
-+
-+      k=0;
-+      pair = strtok (tokenize,",");
-+      while (pair != NULL) {
-+              strcpy(tokens[k++], pair);
-+              pair = strtok (NULL, ",");
-+      }
-+
-+      i=0;
-+      memset(title, 0, sizeof(title));
-+      memset(unit, 0, sizeof(unit));
-+      while(i < k) {
-+              key=strtok(tokens[i], "=");
-+              if(key != NULL) {
-+                      if(strcmp(key,"TITLE") == 0) {
-+                              value = strtok(NULL, "=");
-+                              if(value != NULL) {
-+                                      strcpy(title, value);
-+                              }
-+                      }
-+                      if(strcmp(key,"UNIT") == 0) {
-+                              value = strtok(NULL, "=");
-+                              if(value != NULL) {
-+                                      strcpy(unit, value);
-+                              }
-+                      }
-+              }
-+              i++;
-+      }
-+
-+      for(i=start_offset; i< end_offset-1; i++) {
-+              y_cfg[i*2].region.bottom_left.x = BL_START_X;
-+              y_cfg[i*2].region.bottom_left.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT);
-+              y_cfg[i*2].region.top_right.x = TR_START_X; 
-+              y_cfg[i*2].region.top_right.y = TR_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT);
-+              y_cfg[i*2].line_color.r = 1.0;
-+              y_cfg[i*2].line_color.g = 1.0;
-+              y_cfg[i*2].line_color.b = 1.0;
-+              y_cfg[i*2].line_color.a = 1.0;
-+              y_cfg[i*2].fill_color.r = 0.0;
-+              y_cfg[i*2].fill_color.g = 0.3;
-+              y_cfg[i*2].fill_color.b = 0.0;
-+              y_cfg[i*2].fill_color.a = 0.7;
-+
-+              y_cfg[i*2+1].region.bottom_left.x = TR_START_X;
-+              y_cfg[i*2+1].region.bottom_left.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT);
-+              y_cfg[i*2+1].region.top_right.x = TR_START_X + (BAR_WIDTH); //+ 1 * BL_START_X;
-+              y_cfg[i*2+1].region.top_right.y = TR_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT);;
-+              y_cfg[i*2+1].line_color.r = 1.0;
-+              y_cfg[i*2+1].line_color.g = 1.0;
-+              y_cfg[i*2+1].line_color.b = 1.0;
-+              y_cfg[i*2+1].line_color.a = 1.0;
-+              y_cfg[i*2+1].fill_color.r = 0.3;
-+              y_cfg[i*2+1].fill_color.g = 0.0;
-+              y_cfg[i*2+1].fill_color.b = 0.0;
-+              y_cfg[i*2+1].fill_color.a = 0.7;
-+
-+      
-+              t_cfg[i*2].color.r = 1.0;
-+              t_cfg[i*2].color.g = 1.0;
-+              t_cfg[i*2].color.b = 1.0;
-+              t_cfg[i*2].color.a = 1.0;
-+              t_cfg[i*2].at.x = BL_START_X + 5;
-+              t_cfg[i*2].at.y = BL_START_Y + (i - start_offset) * (BAR_GAP+BAR_HEIGHT) -5;
-+              t_cfg[i*2].fontsize = FONT_SIZE;
-+
-+              t_cfg[i*2+1].color.r = 1.0;
-+              t_cfg[i*2+1].color.g = 1.0;
-+              t_cfg[i*2+1].color.b = 1.0;
-+              t_cfg[i*2+1].color.a = 1.0;
-+              t_cfg[i*2+1].at.x = TR_START_X + 50;//BAR_WIDTH + TR_START_X;
-+              t_cfg[i*2+1].at.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT) -5;
-+              t_cfg[i*2+1].fontsize = FONT_SIZE;
-+
-+              printd("Copying string %s at %d\n", output[i-start_offset], i);
-+              strcpy(bg_text[i*2], output[i-start_offset]);
-+              printd("Setting text 0  %s at %d\n", unit, i*2+1);
-+              sprintf(bg_text[i*2+1], "0 %s", unit);
-+      }
-+      for(i=start_offset; i< end_offset*2; i++) {
-+              printd("%d - (%d, %d) to (%d, %d)\n", i, y_cfg[i].region.bottom_left.x,  y_cfg[i].region.bottom_left.y,  y_cfg[i].region.top_right.x,  y_cfg[i].region.top_right.y);
-+      }
-+
-+      t_cfg[(end_offset-1)*2].color.r = 0.0;
-+      t_cfg[(end_offset-1)*2].color.g = 1.0;
-+      t_cfg[(end_offset-1)*2].color.b = 1.0;
-+      t_cfg[(end_offset-1)*2].color.a = 1.0;
-+      t_cfg[(end_offset-1)*2].at.x = BL_START_X + 80;
-+      t_cfg[(end_offset-1)*2].at.y = BL_START_Y - 40;
-+      t_cfg[(end_offset-1)*2].fontsize = FONT_SIZE + 3;
-+
-+      printd("Copying title string %s\n", title);
-+      strcpy(bg_text[(end_offset-1)*2], title);
-+
-+}
-+      
-+
-+int get_key_value_from_string(char *string, char *limiter, char *key, char *value)
-+{
-+      char *mykey, *myvalue;
-+
-+      mykey=strtok(string, limiter);
-+      if(mykey != NULL) {
-+              myvalue = strtok(NULL, "=");
-+              strtok(myvalue, "\n");
-+              if(myvalue == NULL) {
-+                      return -1;
-+              }
-+      }
-+      else {
-+              return -1;
-+      }
-+      printd("Key is %s\n", mykey);
-+      printd("Value is %s\n", myvalue);
-+      strcpy(key, mykey);
-+      strcpy(value, myvalue);
-+      return 0;
-+
-+}
-+
-+void populate_table_configuration(struct table_configuration *tbl_cfg, int cur_items, char **item_list)
-+{
-+      static int total_items = 0;
-+      static int total_tables = 0;
-+      
-+      tbl_cfg->BAR_HEIGHT = 25;
-+      tbl_cfg->BAR_WIDTH = 150;
-+      tbl_cfg->BL_START_X = 40;
-+      tbl_cfg->BL_START_Y = 80 + (total_items + total_tables) * tbl_cfg->BAR_HEIGHT;
-+      tbl_cfg->BAR_GAP = 0;
-+      tbl_cfg->TR_START_X = tbl_cfg->BL_START_X + tbl_cfg->BAR_WIDTH;
-+      tbl_cfg->TR_START_Y = tbl_cfg->BL_START_Y - tbl_cfg->BAR_HEIGHT;
-+      tbl_cfg->FONT_SIZE = 15;
-+
-+      printf("Proceeding with filling out details...\n");
-+      if(cur_items > 0)
-+              fill_table_details(total_items, total_items+cur_items, item_list, tbl_cfg);
-+
-+      total_items += cur_items;
-+      if(cur_items > 0)
-+              total_tables++;
-+
-+      printf("total_items = %d, total_tables = %d\n", total_items, total_tables);
-+      return;
-+}
-+
-+int fill_list_from_section(char **section_list, char *section_name)
-+{
-+      int total_items, j;
-+
-+      for(j=0; j<20; j++) {
-+              section_list[j] = malloc(100);
-+      }
-+
-+      total_items = get_strings_in_section(section_name, section_list);
-+      printf("\tThe total values in the section %s are %d\n", section_name, total_items);
-+      for(j=0; j<total_items; j++) {
-+              printf("\t\tThe returned strings for BOOT_TIME are %s\n", section_list[j]);
-+      }
-+
-+      total_elements += total_items;
-+
-+      return total_items;
-+}
-+
-+int main(int argc, char *argv[])
-+{
-+      double *bg_y;
-+      double *tg_y;
-+      int i,j;
-+      int refresh_rate;
-+
-+      if (SIG_ERR == signal(SIGPIPE,SIG_IGN))
-+              exit(1);
-+
-+      if (SIG_ERR == signal(SIGINT,my_signal_handler))
-+              exit(1);
-+
-+      if (SIG_ERR == signal(SIGTERM,my_signal_handler))
-+              exit(1);
-+
-+      if(argc == 2) {
-+              printf("Enabling debug\n");
-+              debug = atoi(argv[1]);
-+      }
-+      else {
-+              printf("Debug is disabled\n");
-+              debug = 0;
-+      }
-+
-+      char *output[20];
-+      int total = fill_list_from_section(output, "GLOBAL");
-+      for(j=0; j<total; j++) {
-+              char key[100], value[100];
-+              int ret = get_key_value_from_string(output[j], "=", key, value);
-+              if(ret == 0) {
-+                      if(strcmp(key, "FIFO") == 0) {
-+                              strcpy(readfifo, value);
-+                      }
-+                      if(strcmp(key, "REFRESH_RATE_USEC") == 0) {
-+                              refresh_rate = atoi(value);
-+                      }
-+                      if(strcmp(key, "MAX_WIDTH") == 0) {
-+                              MAX_WIDTH = atoi(value);
-+                      }
-+                      if(strcmp(key, "MAX_HEIGHT") == 0) {
-+                              MAX_HEIGHT = atoi(value);
-+                      }
-+                      if(strcmp(key, "X_POS") == 0) {
-+                              x_pos = atoi(value);
-+                      }
-+                      if(strcmp(key, "Y_POS") == 0) {
-+                              y_pos = atoi(value);
-+                      }
-+              }
-+                              
-+      }
-+
-+      printf("\n-------------------------------------------------\n");
-+      printf("Configured REFRESH_RATE is %d\n", refresh_rate);
-+      printf("Configured FIFO is %s\n", readfifo);
-+      printf("Configured MAX_WIDTH is %d\n", MAX_WIDTH);
-+      printf("Configured MAX_HEIGHT is %d\n", MAX_HEIGHT);
-+      printf("Configured starting location is (%d, %d)\n", x_pos, y_pos);
-+      printf("\n-------------------------------------------------\n");
-+
-+      int fd = open(readfifo, O_RDONLY|O_NONBLOCK);
-+      if (fd != -1) {
-+              printf("SUCCESS: Configured FIFO exists\n");
-+              close(fd);
-+      }
-+      else {
-+              printf("ERROR: %s not found\nPlease create the fifo by executing mkfifo %s before running the application\n", readfifo, readfifo);
-+              exit(0);
-+      }
-+              
-+
-+      bg_p.title = malloc(100);
-+      sprintf(bg_p.title, "CPU Usage[@position-req=%dx%d]", x_pos, y_pos);
-+
-+      /* ------------------------------------------------------------------------*/
-+      /* Section for populating all lists from cfg sections*/
-+      /* ------------------------------------------------------------------------*/
-+      char *boot_list[20];
-+      int total_boot_items = fill_list_from_section(boot_list, "BOOT_TIME");
-+
-+      char *temperature_list[20];
-+      int total_temperature_items = fill_list_from_section(temperature_list, "TEMPERATURE");
-+
-+      char *cpu_load_list[20];
-+      total_cpu_load_items = fill_list_from_section(cpu_load_list, "CPU_LOAD");
-+
-+      char *voltage_list[20];
-+      int total_voltage_items = fill_list_from_section(voltage_list, "VOLTAGE");
-+
-+      char *frequency_list[20];
-+      int total_frequency_items = fill_list_from_section(frequency_list, "FREQUENCY");
-+      /* ------------------------------------------------------------------------*/
-+      /* total_elements will be updated inside the fill_list_from_section function */
-+
-+      t_cfg = malloc(sizeof(struct _text_config) * (total_elements*2 + 1));
-+      y_cfg = malloc(sizeof(struct _bar_graph_y_config) * total_elements*2);
-+      bg_p.num_of_y_items = total_elements*2;
-+      bg_p.y_config_array = y_cfg;
-+      bg_p.num_of_text_items = total_elements*2 + 1;
-+      bg_p.text_config_array = t_cfg;
-+
-+      bg_y = malloc(sizeof(double) * total_elements * 2);
-+      for(i=0; i< (total_elements*2+1); i++) {
-+              bg_text[i] = malloc(150);
-+              bg_y[i] = 1.0;
-+      }
-+
-+      tg_y = malloc(sizeof(double) * total_elements * 2);
-+      for(i=0; i< (total_elements*2+1); i++) {
-+              tg_text[i] = malloc(150);
-+              tg_y[i] = 0.1 * i;
-+      }
-+
-+      struct table_configuration boot_table_config; 
-+        populate_table_configuration(&boot_table_config, total_boot_items, boot_list);
-+
-+      struct table_configuration temp_table_config; 
-+        populate_table_configuration(&temp_table_config, total_temperature_items, temperature_list);
-+
-+      struct table_configuration voltage_table_config; 
-+        populate_table_configuration(&voltage_table_config, total_voltage_items, voltage_list);
-+
-+      struct table_configuration frequency_table_config; 
-+        populate_table_configuration(&frequency_table_config, total_frequency_items, frequency_list);
-+
-+      struct table_configuration cpu_load_config; 
-+      cpu_load_config.BL_START_X = 40;
-+      cpu_load_config.BL_START_Y = 80 + (total_boot_items + total_temperature_items + total_voltage_items + total_frequency_items+ 4) * boot_table_config.BAR_HEIGHT + 80 /*cpu_load_config.BAR_HEIGHT */;
-+      cpu_load_config.BAR_GAP = 20;
-+      cpu_load_config.BAR_HEIGHT = 80;
-+      cpu_load_config.BAR_WIDTH = 40;
-+      cpu_load_config.TR_START_X = cpu_load_config.BL_START_X + cpu_load_config.BAR_WIDTH;
-+      cpu_load_config.TR_START_Y = cpu_load_config.BL_START_Y - cpu_load_config.BAR_HEIGHT;
-+      cpu_load_config.FONT_SIZE = 15;
-+      if(total_cpu_load_items > 0) {
-+              fill_cpu_load_details(total_boot_items+total_temperature_items+total_voltage_items+total_frequency_items, total_boot_items+total_temperature_items+total_voltage_items+total_frequency_items+total_cpu_load_items, cpu_load_list, &cpu_load_config);
-+      }
-+      else {
-+              cpu_load_offset = total_boot_items + total_temperature_items + total_voltage_items + total_frequency_items;
-+      }
-+
-+      tg_p.title=(char *)malloc(100);
-+      sprintf(tg_p.title, "CPU Usage[@position-req=%dx%d]", x_pos, y_pos);
-+      tg_p.height = MAX_HEIGHT;
-+      tg_p.width = MAX_WIDTH;
-+
-+      struct _y_config *tg_y_cfg = malloc(tg_p.num_of_y_items * sizeof(struct _y_config));
-+      tg_p.y_config_array = tg_y_cfg;
-+      tg_p.text_config_array = t_cfg;
-+
-+        printf("Proceeding to create starting visualization...\n");
-+      ctx = time_graph_create(argc, argv, &tg_p);
-+      if (!ctx) {
-+              printf("Unable to create time_graph... \n");
-+              exit(0);
-+      }
-+
-+      ctx = bar_graph_create(argc, argv, &bg_p);
-+      if (!ctx) {
-+              printf("Error creating context\n");
-+              exit(0);
-+      }
-+
-+      command_handler(OPEN, NULL, NULL);
-+
-+      /* Plot the graph first time */
-+      time_graph_plot(ctx, tg_y, (const char **)tg_text);
-+      bar_graph_plot(ctx, bg_y, (const char **)bg_text);
-+
-+      while (!sigtermed)
-+      {
-+              usleep(refresh_rate);
-+              int bytes_read = command_handler(READ, bg_y, bg_text);
-+              if(bytes_read > 0) {
-+                      time_graph_plot(ctx, tg_y, (const char **)tg_text);
-+                      bar_graph_plot(ctx, bg_y, (const char **)bg_text);
-+              }
-+      }
-+
-+      bar_graph_destroy(ctx);
-+      command_handler(CLOSE, NULL, NULL);
-+      return 0;
-+}
-diff --git a/clients/soc_performance_monitor.h b/clients/soc_performance_monitor.h
-new file mode 100644
-index 0000000..861c8c7
---- /dev/null
-+++ b/clients/soc_performance_monitor.h
-@@ -0,0 +1,40 @@
-+#define __SLEEP  usleep(1000000)
-+
-+#define MAX_BUF 1024
-+#define OPEN 1
-+#define READ 2
-+#define CLOSE 3
-+
-+#define MAX_COLORS 12
-+
-+#define printd(fmt, ...) \
-+      do { if (debug) fprintf(stderr, fmt, __VA_ARGS__); } while (0)
-+
-+
-+struct _rgba pallette[MAX_COLORS] = 
-+{
-+      { 1.0, 0.0, 0.0, 1.0 },
-+      { 0.0, 0.5, 0.0, 1.0 },
-+      { 0.0, 0.0, 1.0, 1.0 },
-+      { 0.0, 0.0, 0.0, 1.0 },
-+      { 0.0, 0.5, 1.0, 1.0 },
-+      { 1.0, 0.0, 1.0, 1.0 },
-+      { 0.5, 0.5, 1.0, 1.0 },
-+      { 1.0, 0.5, 0.0, 1.0 },
-+      { 0.5, 0.5, 0.25, 1.0 },
-+      { 0.5, 0.0, 0.0, 1.0 },
-+      { 1.0, 0.5, 0.5, 1.0 },
-+      { 0.0, 0.0, 0.20, 1.0 }
-+};
-+
-+struct table_configuration {
-+      int BL_START_X;
-+      int BL_START_Y;
-+      int BAR_GAP;
-+      int BAR_HEIGHT;
-+      int BAR_WIDTH;
-+      int TR_START_X;
-+      int TR_START_Y;
-+      int FONT_SIZE;
-+};
-+
-diff --git a/clients/statcoll.c b/clients/statcoll.c
-new file mode 100644
-index 0000000..5d5cae7
---- /dev/null
-+++ b/clients/statcoll.c
-@@ -0,0 +1,1433 @@
-+/*
-+ * Copyright (C) 2015 Texas Instruments
-+ * created by prash@ti.com on 16 Jan 2013
-+ * Adapted to Linux with changes in framework: Karthik R <karthik.ramanan@ti.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published by
-+ * the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program.  If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <sys/mman.h>
-+#include <fcntl.h>
-+#include <signal.h>
-+#include <unistd.h>
-+#include <sys/time.h>
-+
-+#include "statcoll.h"
-+#include "statcoll_gui.h"
-+#include "time_bar_graph.h"
-+
-+#define ENABLE_MODE      0x0
-+#define READ_STATUS_MODE 0x1
-+
-+
-+
-+#define OPEN 1
-+#define READ 2
-+#define CLOSE 3
-+
-+
-+#if 1
-+#define __SLEEP  sleep(1)
-+#else
-+#define __SLEEP  usleep(100000)
-+#endif
-+//#define DUMMY_MODE
-+
-+#define MAX_COLORS 12
-+
-+struct _rgba pallette[MAX_COLORS] = 
-+{
-+      { 1.0, 0.0, 0.0, 1.0 },
-+      { 0.0, 0.5, 0.0, 1.0 },
-+      { 0.0, 0.0, 1.0, 1.0 },
-+      { 0.0, 0.0, 0.0, 1.0 },
-+      { 0.0, 0.5, 1.0, 1.0 },
-+      { 1.0, 0.0, 1.0, 1.0 },
-+      { 0.5, 0.5, 1.0, 1.0 },
-+      { 1.0, 0.5, 0.0, 1.0 },
-+      { 0.5, 0.5, 0.25, 1.0 },
-+      { 0.5, 0.0, 0.0, 1.0 },
-+      { 1.0, 0.5, 0.5, 1.0 },
-+      { 0.0, 0.0, 0.20, 1.0 }
-+};
-+
-+const struct list_of_initiators initiators[STATCOL_MAX] =
-+{
-+    { STATCOL_EMIF1_SYS, "STATCOL_EMIF1_SYS" },
-+    { STATCOL_EMIF2_SYS,"STATCOL_EMIF2_SYS" },
-+    { STATCOL_MA_MPU_P1,"STATCOL_MPU_P1" },
-+    { STATCOL_MA_MPU_P2,"STATCOL_MPU_P2" },
-+    { STATCOL_MPU1,"STATCOL_MPU1" },
-+    { STATCOL_MMU1,"STATCOL_MMU1" },
-+    { STATCOL_TPTC_RD1,"STATCOL_TPTC_RD1" },
-+    { STATCOL_TPTC_WR1,"STATCOL_TPTC_WR1" },
-+    { STATCOL_TPTC_RD2,"STATCOL_TPTC_RD2" },
-+    { STATCOL_TPTC_WR2,"STATCOL_TPTC_WR2" },
-+    { STATCOL_VIP1_P1,"STATCOL_VIP1_P1" },
-+    { STATCOL_VIP1_P2,"STATCOL_VIP1_P2" },
-+    { STATCOL_VIP2_P1,"STATCOL_VIP2_P1" },
-+    { STATCOL_VIP2_P2,"STATCOL_VIP2_P2" },
-+    { STATCOL_VIP3_P1,"STATCOL_VIP3_P1" },
-+    { STATCOL_VIP3_P2,"STATCOL_VIP3_P2" },
-+    { STATCOL_VPE_P1,"STATCOL_VPE_P1" },
-+    { STATCOL_VPE_P2,"STATCOL_VPE_P2" },
-+    { STATCOL_EVE1_TC0,"STATCOL_EVE1_TC0" },
-+    { STATCOL_EVE1_TC1,"STATCOL_EVE1_TC1" },
-+    { STATCOL_EVE2_TC0,"STATCOL_EVE2_TC0" },
-+    { STATCOL_EVE2_TC1,"STATCOL_EVE2_TC1" },
-+    { STATCOL_EVE3_TC0,"STATCOL_EVE3_TC0" },
-+    { STATCOL_EVE3_TC1,"STATCOL_EVE3_TC1" },
-+    { STATCOL_EVE4_TC0,"STATCOL_EVE4_TC0" },
-+    { STATCOL_EVE4_TC1,"STATCOL_EVE4_TC1" },
-+    { STATCOL_DSP1_MDMA,"STATCOL_DSP1_MDMA" },
-+    { STATCOL_DSP1_EDMA,"STATCOL_DSP1_EDMA" },
-+    { STATCOL_DSP2_MDMA,"STATCOL_DSP2_MDMA" },
-+    { STATCOL_DSP2_EDMA,"STATCOL_DSP2_EDMA" },
-+    { STATCOL_IVA,"STATCOL_IVA" },
-+    { STATCOL_GPU_P1,"STATCOL_GPU_P1" },
-+    { STATCOL_GPU_P2,"STATCOL_GPU_P2" },
-+    { STATCOL_BB2D_P1,"STATCOL_BB2D_P1" },
-+    { STATCOL_DSS,"STATCOL_DSS" },
-+    { STATCOL_CSI2_2,"STATCOL_CSI2_2" },
-+    { STATCOL_MMU2,"STATCOL_MMU2" },
-+    { STATCOL_IPU1,"STATCOL_IPU1" },
-+    { STATCOL_IPU2,"STATCOL_IPU2" },
-+    { STATCOL_DMA_SYSTEM_RD,"STATCOL_DMA_SYSTEM_RD" },
-+    { STATCOL_DMA_SYSTEM_WR,"STATCOL_DMA_SYSTEM_WR" },
-+    { STATCOL_CSI2_1,"STATCOL_CSI2_1" },
-+    { STATCOL_USB3_SS,"STATCOL_USB3_SS" },
-+    { STATCOL_USB2_SS,"STATCOL_USB2_SS" },
-+    { STATCOL_USB2_ULPI_SS1,"STATCOL_USB2_ULPI_SS1" },
-+    { STATCOL_USB2_ULPI_SS2,"STATCOL_USB2_ULPI_SS2" },
-+    { STATCOL_PCIE_SS1,"STATCOL_PCIE_SS1" },
-+    { STATCOL_PCIE_SS2,"STATCOL_PCIE_SS2" },
-+    { STATCOL_DSP1_CFG,"STATCOL_DSP1_CFG" },
-+    { STATCOL_DSP2_CFG,"STATCOL_DSP2_CFG" },
-+    { STATCOL_GMAC_SW,"STATCOL_GMAC_SW" },
-+    { STATCOL_PRUSS1_P1,"STATCOL_PRUSS1_P1" },
-+    { STATCOL_PRUSS1_P2,"STATCOL_PRUSS1_P2" },
-+    { STATCOL_PRUSS2_P1,"STATCOL_PRUSS2_P1" },
-+    { STATCOL_PRUSS2_P2,"STATCOL_PRUSS2_P2" },
-+    { STATCOL_DMA_CRYPTO_RD,"STATCOL_DMA_CRYPTO_RD" },
-+    { STATCOL_DMA_CRYPTO_WR,"STATCOL_DMA_CRYPTO_WR" },
-+    { STATCOL_MPU2,"STATCOL_MPU2" },
-+    { STATCOL_MMC1,"STATCOL_MMC1" },
-+    { STATCOL_MMC2,"STATCOL_MMC2" },
-+    { STATCOL_SATA,"STATCOL_SATA" },
-+    { STATCOL_MLBSS,"STATCOL_MLBSS" },
-+    { STATCOL_BB2D_P2,"STATCOL_BB2D_P2" },
-+    { STATCOL_IEEE1500,"STATCOL_IEEE1500" },
-+    { STATCOL_DBG,"STATCOL_DBG" },
-+    { STATCOL_VCP1,"STATCOL_VCP1" },
-+    { STATCOL_OCMC_RAM1,"STATCOL_OCMC_RAM1" },
-+    { STATCOL_OCMC_RAM2,"STATCOL_OCMC_RAM2" },
-+    { STATCOL_OCMC_RAM3,"STATCOL_OCMC_RAM3" },
-+    { STATCOL_GPMC,"STATCOL_GPMC" },
-+    { STATCOL_MCASP1,"STATCOL_MCASP1" },
-+    { STATCOL_MCASP2,"STATCOL_MCASP2" },
-+    { STATCOL_MCASP3,"STATCOL_MCASP3" },
-+    { STATCOL_VCP2,  "STATCOL_VCP2" }
-+}; 
-+
-+StatCollectorObj gStatColState;
-+
-+static void *statcoll_base_mem;
-+static int *l3_3_clkctrl;
-+
-+static UInt32 *statCountDSS = NULL;
-+static UInt32 *statCountIVA = NULL;
-+static UInt32 *statCountBB2DP1 = NULL;
-+static UInt32 *statCountBB2DP2 = NULL;
-+static UInt32 *statCountUSB4 = NULL;
-+static UInt32 *statCountSata = NULL;
-+static UInt32 *statCountEmif1 = NULL;
-+static UInt32 *statCountEmif2 = NULL;
-+
-+
-+static statcoll_initiators_object global_object[STATCOL_MAX];
-+UInt32 statCountIdx = 0;
-+UInt32 TRACE_SZ = 0;
-+
-+void create_overall_box(struct _bar_graph_y_config *y_cfg, struct _text_config *t_cfg, char *text[])
-+{
-+        int i=0;
-+
-+        memset(y_cfg, 0x0, sizeof(struct _y_config)*25);
-+        memset(t_cfg, 0x0, sizeof(struct _text_config)*25);
-+
-+
-+        for(i=0; i<TOTAL_Y_PARAMETERS; i++) {
-+                (y_cfg+i)->line_color.r = 1.0;
-+                (y_cfg+i)->line_color.g = 1.0;
-+                (y_cfg+i)->line_color.b = 1.0;
-+                (y_cfg+i)->line_color.a = 0.7;
-+                (y_cfg+i)->fill_color.r = 0.0;
-+                (y_cfg+i)->fill_color.g = 0.0;
-+                (y_cfg+i)->fill_color.b = 0.0;
-+                (y_cfg+i)->fill_color.a = 0.1;
-+        }
-+
-+        (y_cfg+0)->region.bottom_left.x = 0;
-+        (y_cfg+0)->region.bottom_left.y = MAX_HEIGHT - HEIGHT_EMIF_AREA;
-+        (y_cfg+0)->region.top_right.x = MAX_WIDTH;
-+        (y_cfg+0)->region.top_right.y = 0;
-+
-+        (t_cfg+0)->at.x = MAX_WIDTH/2 - 8*FONT_SIZE - 50;
-+        (t_cfg+0)->at.y = BORDER - FONT_SIZE + 6;
-+        strcpy(text[0], string_list[0]);
-+
-+        (y_cfg+1)->region.bottom_left.x = TIME_GRAPH_AREA_BL_X;
-+        (y_cfg+1)->region.bottom_left.y = TIME_GRAPH_AREA_BL_Y;
-+        (y_cfg+1)->region.top_right.x = TIME_GRAPH_AREA_TR_X;
-+        (y_cfg+1)->region.top_right.y = TIME_GRAPH_AREA_TR_Y;
-+
-+        (t_cfg+1)->at.x = TIME_GRAPH_AREA_BL_X - 2*FONT_SIZE;
-+        (t_cfg+1)->at.y = TIME_GRAPH_AREA_TR_Y;
-+        strcpy(text[1],string_list[1]);
-+
-+        for(i=2; i<7; i++)
-+        {
-+                (y_cfg+i)->region.bottom_left.x = TIME_GRAPH_AREA_BL_X;
-+                (y_cfg+i)->region.bottom_left.y = TIME_GRAPH_AREA_BL_Y;// - (i-2) * (30);
-+                (y_cfg+i)->region.top_right.x = TIME_GRAPH_AREA_TR_X;
-+                (y_cfg+i)->region.top_right.y = TIME_GRAPH_AREA_TR_Y + (i-1) * ((TIME_GRAPH_AREA_BL_Y - TIME_GRAPH_AREA_TR_Y)/5);
-+                (t_cfg+i)->at.x = TIME_GRAPH_AREA_BL_X - 2*FONT_SIZE;
-+                (t_cfg+i)->at.y = TIME_GRAPH_AREA_TR_Y + (i-1) * ((TIME_GRAPH_AREA_BL_Y - TIME_GRAPH_AREA_TR_Y)/5);//TIME_GRAPH_AREA_TR_Y;
-+                strcpy(text[i],string_list[i]);
-+        }
-+
-+#if 1
-+        (y_cfg+7)->region.bottom_left.x = EMIF_AREA_BL_X;
-+        (y_cfg+7)->region.bottom_left.y = EMIF_AREA_BL_Y;
-+        (y_cfg+7)->region.top_right.x = EMIF_AREA_TR_X;
-+        (y_cfg+7)->region.top_right.y = EMIF_AREA_TR_Y;
-+
-+        (t_cfg+7)->at.x = WIDTH_EMIF_AREA/2 - 2*FONT_SIZE;
-+        (t_cfg+7)->at.y = EMIF_AREA_TR_Y + FONT_SIZE;
-+        strcpy(text[7],string_list[7]);
-+
-+        for(i=8; i<12; i=i+2)
-+        {
-+                (y_cfg+i)->region.bottom_left.x = EMIF_AREA_BL_X + BORDER + (i-8)*(BAR_WIDTH+BAR_GAP)/2;
-+                (y_cfg+i)->region.bottom_left.y = EMIF_AREA_BL_Y - BORDER/2;// - (i-2) * (30);
-+                (y_cfg+i)->region.top_right.x = EMIF_AREA_BL_X + BORDER + BAR_WIDTH + (i-8) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i)->region.top_right.y = EMIF_AREA_TR_Y + BORDER * 1.2;
-+
-+                (y_cfg+i)->fill_color.r = 1.0;
-+                (y_cfg+i)->fill_color.g = 0.0;
-+                (y_cfg+i)->fill_color.b = 0.0;
-+                (y_cfg+i)->fill_color.a = 0.1;
-+
-+                (y_cfg+i+1)->region.bottom_left.x = EMIF_AREA_BL_X + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i+1)->region.bottom_left.y = EMIF_AREA_BL_Y - BORDER/2;
-+                (y_cfg+i+1)->region.top_right.x = EMIF_AREA_BL_X + BORDER + BAR_WIDTH + (i-8) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i+1)->region.top_right.y = EMIF_AREA_TR_Y + BORDER*1.2;
-+
-+                (y_cfg+i+1)->fill_color.r = 0.0;
-+                (y_cfg+i+1)->fill_color.g = 1.0;
-+                (y_cfg+i+1)->fill_color.b = 0.0;
-+                (y_cfg+i+1)->fill_color.a = 1.0;
-+
-+                (t_cfg+i)->at.x = EMIF_AREA_BL_X + BAR_WIDTH + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2- 2.2*FONT_SIZE;
-+                (t_cfg+i)->at.y = EMIF_AREA_TR_Y + BORDER*1.2 -5;
-+
-+                /* Fixed strings */
-+                (t_cfg+i+1)->at.x = EMIF_AREA_BL_X + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2;
-+                (t_cfg+i+1)->at.y = EMIF_AREA_BL_Y;// - BORDER + FONT_SIZE;
-+
-+                strcpy(text[i],string_list[i]);
-+                strcpy(text[i+1],string_list[i+1]);
-+        }
-+
-+        (y_cfg+12)->region.bottom_left.x = INITIATORS_AREA_BL_X;
-+        (y_cfg+12)->region.bottom_left.y = INITIATORS_AREA_BL_Y;
-+        (y_cfg+12)->region.top_right.x = INITIATORS_AREA_TR_X;
-+        (y_cfg+12)->region.top_right.y = INITIATORS_AREA_TR_Y;
-+
-+        (t_cfg+12)->at.x = EMIF_AREA_TR_X + (INITIATORS_AREA_TR_X - INITIATORS_AREA_BL_X)/2 - 4 * FONT_SIZE;
-+        (t_cfg+12)->at.y = INITIATORS_AREA_TR_Y + FONT_SIZE;
-+        strcpy(text[12],string_list[12]);
-+
-+        for(i=13; i<25; i=i+2)
-+        {
-+                (y_cfg+i)->region.bottom_left.x = INITIATORS_AREA_BL_X + BORDER + (i-13)*(BAR_WIDTH+BAR_GAP)/2;
-+                (y_cfg+i)->region.bottom_left.y = INITIATORS_AREA_BL_Y - BORDER/2;// - (i-2) * (30);
-+                (y_cfg+i)->region.top_right.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i)->region.top_right.y = INITIATORS_AREA_TR_Y + BORDER*1.2;
-+
-+                (y_cfg+i)->fill_color.r = 1.0;
-+                (y_cfg+i)->fill_color.g = 0.0;
-+                (y_cfg+i)->fill_color.b = 0.0;
-+                (y_cfg+i)->fill_color.a = 0.1;
-+
-+                (y_cfg+i+1)->region.bottom_left.x = INITIATORS_AREA_BL_X + BORDER + (i-13) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i+1)->region.bottom_left.y = INITIATORS_AREA_BL_Y - BORDER/2;// - (i-2) * (30);
-+                (y_cfg+i+1)->region.top_right.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2;
-+                (y_cfg+i+1)->region.top_right.y = INITIATORS_AREA_TR_Y + BORDER* 1.2;
-+
-+                (y_cfg+i+1)->fill_color.r = 0.0;
-+                (y_cfg+i+1)->fill_color.g = 1.0;
-+                (y_cfg+i+1)->fill_color.b = 0.0;
-+                (y_cfg+i+1)->fill_color.a = 1.0;
-+
-+                (t_cfg+i)->at.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2 - 2.2* FONT_SIZE;
-+                (t_cfg+i)->at.y = INITIATORS_AREA_TR_Y + BORDER*1.2 -5;
-+
-+                (t_cfg+i+1)->at.x = INITIATORS_AREA_BL_X + BORDER + (i-13)*(BAR_WIDTH+BAR_GAP)/2;
-+                (t_cfg+i+1)->at.y = INITIATORS_AREA_BL_Y;
-+
-+                strcpy(text[i],string_list[i]);
-+                strcpy(text[i+1],string_list[i+1]);
-+        }
-+#endif
-+
-+#if 0
-+        for(i=0; i<25; i++)
-+                printf("(%d, %d) to (%d, %d)\n", (y_cfg +i)->region.bottom_left.x,(y_cfg +i)->region.bottom_left.y,(y_cfg +i)->region.top_right.x, (y_cfg +i)->region.top_right.y);
-+#endif
-+
-+
-+
-+        for(i=0; i<25; i++) {
-+                (t_cfg+i)->color.r = 0.0;
-+                (t_cfg+i)->color.g = 1.0;
-+                (t_cfg+i)->color.b = 1.0;
-+                (t_cfg+i)->color.a = 1.0;
-+                (t_cfg+i)->fontsize = FONT_SIZE;
-+        }
-+                (t_cfg+0)->fontsize = 20;
-+
-+
-+}
-+
-+
-+void statCollectorInit()
-+{
-+    int index;
-+
-+    gStatColState.stat0_filter_cnt = 0;
-+    gStatColState.stat1_filter_cnt = 0;
-+    gStatColState.stat2_filter_cnt = 0;
-+    gStatColState.stat3_filter_cnt = 0;
-+    gStatColState.stat4_filter_cnt = 0;
-+    gStatColState.stat5_filter_cnt = 0;
-+    gStatColState.stat6_filter_cnt = 0;
-+    gStatColState.stat7_filter_cnt = 0;
-+    gStatColState.stat8_filter_cnt = 0;
-+    gStatColState.stat9_filter_cnt = 0;
-+
-+    for(index=STATCOL_EMIF1_SYS; index < STATCOL_MAX; index++)
-+    {
-+      global_object[index].b_enabled = 0;
-+
-+      strcpy(global_object[index].name, initiators[index].name); 
-+
-+      global_object[index].readings = malloc(TRACE_SZ * sizeof(UInt32));
-+      memset(global_object[index].readings, 0, TRACE_SZ * sizeof(UInt32));
-+
-+      global_object[index].timestamp = NULL;
-+
-+      global_object[index].group_id = 0xFF;
-+      global_object[index].counter_id = 0;
-+      global_object[index].base_address = 0;
-+      global_object[index].mux_req = 0;
-+    }
-+
-+}
-+
-+void wr_stat_reg(UInt32 address, UInt32 data)
-+{
-+    UInt32 *mymem = statcoll_base_mem;
-+    UInt32 delta = (address - STATCOLL_BASE) / 4;
-+#ifndef DUMMY_MODE
-+    mymem[delta] = data;
-+#else
-+    printf("WRITE: Address = 0x%x, Data = 0x%x\n", address, data);
-+#endif
-+}
-+
-+UInt32 rd_stat_reg(UInt32 address)
-+{
-+#ifndef DUMMY_MODE
-+    UInt32 *mymem = statcoll_base_mem;
-+    UInt32 data;
-+    UInt32 delta = (address - STATCOLL_BASE) / 4;
-+    data = mymem[delta];
-+    return data;
-+#else
-+    printf("READ: Address = 0x%x\n", address);
-+#endif
-+}
-+
-+UInt32 statCollectorControlInitialize(UInt32 instance_id)
-+{
-+    UInt32 cur_base_address = 0;
-+    UInt32 cur_event_mux_req;
-+    UInt32 cur_event_mux_resp;
-+    UInt32 cur_stat_filter_cnt;
-+
-+    switch (instance_id)
-+    {
-+    case STATCOL_EMIF1_SYS:
-+        cur_base_address = stat_coll0_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat0_filter_cnt;
-+      global_object[instance_id].group_id = 0;
-+        break;
-+    case STATCOL_EMIF2_SYS:
-+        cur_base_address = stat_coll0_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat0_filter_cnt;
-+      global_object[instance_id].group_id = 0;
-+        break;
-+    case STATCOL_MA_MPU_P1:
-+        cur_base_address = stat_coll0_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat0_filter_cnt;
-+      global_object[instance_id].group_id = 0;
-+        break;
-+    case STATCOL_MA_MPU_P2:
-+        cur_base_address = stat_coll0_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat0_filter_cnt;
-+      global_object[instance_id].group_id = 0;
-+        break;
-+    case STATCOL_MPU1:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_MMU1:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_TPTC_RD1:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_TPTC_WR1:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_TPTC_RD2:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_TPTC_WR2:
-+        cur_base_address = stat_coll1_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat1_filter_cnt;
-+      global_object[instance_id].group_id = 1;
-+        break;
-+    case STATCOL_VIP1_P1:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VIP1_P2:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VIP2_P1:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VIP2_P2:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VIP3_P1:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VIP3_P2:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VPE_P1:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_VPE_P2:
-+        cur_base_address = stat_coll2_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat2_filter_cnt;
-+      global_object[instance_id].group_id = 2;
-+        break;
-+    case STATCOL_EVE1_TC0:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE1_TC1:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE2_TC0:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE2_TC1:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE3_TC0:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE3_TC1:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE4_TC0:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_EVE4_TC1:
-+        cur_base_address = stat_coll3_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat3_filter_cnt;
-+      global_object[instance_id].group_id = 3;
-+        break;
-+    case STATCOL_DSP1_MDMA:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_DSP1_EDMA:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_DSP2_MDMA:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_DSP2_EDMA:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_IVA:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_GPU_P1:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_GPU_P2:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_BB2D_P1:
-+        cur_base_address = stat_coll4_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat4_filter_cnt;
-+      global_object[instance_id].group_id = 4;
-+        break;
-+    case STATCOL_DSS:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_CSI2_2:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_MMU2:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_IPU1:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_IPU2:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_DMA_SYSTEM_RD:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_DMA_SYSTEM_WR:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_CSI2_1:
-+        cur_base_address = stat_coll5_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat5_filter_cnt;
-+      global_object[instance_id].group_id = 5;
-+        break;
-+    case STATCOL_USB3_SS:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_USB2_SS:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_USB2_ULPI_SS1:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_USB2_ULPI_SS2:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_PCIE_SS1:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_PCIE_SS2:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_DSP1_CFG:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_DSP2_CFG:
-+        cur_base_address = stat_coll6_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat6_filter_cnt;
-+      global_object[instance_id].group_id = 6;
-+        break;
-+    case STATCOL_GMAC_SW:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_PRUSS1_P1:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_PRUSS1_P2:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_PRUSS2_P1:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_PRUSS2_P2:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_DMA_CRYPTO_RD:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_DMA_CRYPTO_WR:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_MPU2:
-+        cur_base_address = stat_coll7_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat7_filter_cnt;
-+      global_object[instance_id].group_id = 7;
-+        break;
-+    case STATCOL_MMC1:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_MMC2:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_SATA:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_MLBSS:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_BB2D_P2:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_IEEE1500:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_DBG:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_VCP1:
-+        cur_base_address = stat_coll8_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat8_filter_cnt;
-+      global_object[instance_id].group_id = 8;
-+        break;
-+    case STATCOL_OCMC_RAM1:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 0;
-+        cur_event_mux_resp = 1;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_OCMC_RAM2:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 2;
-+        cur_event_mux_resp = 3;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_OCMC_RAM3:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 4;
-+        cur_event_mux_resp = 5;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_GPMC:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 6;
-+        cur_event_mux_resp = 7;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_MCASP1:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 8;
-+        cur_event_mux_resp = 9;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_MCASP2:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 10;
-+        cur_event_mux_resp = 11;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_MCASP3:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 12;
-+        cur_event_mux_resp = 13;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    case STATCOL_VCP2:
-+        cur_base_address = stat_coll9_base_address;
-+        cur_event_mux_req = 14;
-+        cur_event_mux_resp = 15;
-+        gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1;
-+        cur_stat_filter_cnt = gStatColState.stat9_filter_cnt;
-+      global_object[instance_id].group_id = 9;
-+        break;
-+    default:
-+       printf("ERROR: Unknown initiator %d\n", instance_id);
-+       exit(0);
-+    };
-+
-+    {
-+        if ( cur_stat_filter_cnt > 4 )
-+        {
-+            printf("WARNING: We have exhausted filters/counters.....\n");
-+            return 0;
-+        }
-+        // Global Enable Stat Collector
-+        wr_stat_reg(cur_base_address+0x8,0x1);
-+
-+        // Soft Enable Stat Collector
-+        wr_stat_reg(cur_base_address+0xC,0x1);
-+
-+        wr_stat_reg(cur_base_address+0x18,0x5);
-+        // Operation of Stat Collector / RespEvt => Packet
-+        wr_stat_reg(cur_base_address+0x1C,0x5);
-+
-+
-+        // Event Sel
-+        wr_stat_reg(cur_base_address+0x20+4*(cur_stat_filter_cnt-1),cur_event_mux_req);
-+
-+        // Op is EventInfo
-+        wr_stat_reg(cur_base_address+0x1FC+(0x158*(cur_stat_filter_cnt-1)),2);
-+
-+        // Event Info Sel Op -> packet length
-+        wr_stat_reg(cur_base_address+0x1F8+(0x158*(cur_stat_filter_cnt-1)),0);
-+
-+        // Filter Global Enable
-+        wr_stat_reg(cur_base_address+0xAC+(0x158*(cur_stat_filter_cnt-1)),0x1);
-+
-+        // Filter Enable
-+        wr_stat_reg(cur_base_address+0xBC+(0x158*(cur_stat_filter_cnt-1)),0x1);
-+
-+        // Manual dump
-+        wr_stat_reg(cur_base_address+0x54,0x1);
-+        // use send register to reset counters
-+
-+    }
-+
-+    global_object[instance_id].mux_req = cur_event_mux_req;
-+    global_object[instance_id].base_address = cur_base_address;
-+    global_object[instance_id].counter_id = cur_stat_filter_cnt;
-+    global_object[instance_id].b_enabled = 1;
-+
-+    return cur_stat_filter_cnt;
-+}
-+
-+
-+
-+void statCollectorReadGroup(UInt32 group_id)
-+{
-+    int i=0;
-+    UInt32 cur_base_address = 0x45001000 + ((group_id - 1) * 0x1000);
-+
-+    wr_stat_reg(cur_base_address+0xC,0x0);
-+
-+    for(i=0; i < STATCOL_MAX; i++)
-+    {
-+      if(global_object[i].group_id == (group_id - 1) && 
-+         global_object[i].b_enabled == 1)
-+      {
-+          UInt32 cur_stat_filter_cnt = global_object[i].counter_id;
-+
-+          global_object[i].readings[statCountIdx] = rd_stat_reg(cur_base_address+0x8C+((cur_stat_filter_cnt-1)*4));
-+        }
-+    }
-+
-+    wr_stat_reg(cur_base_address+0xC,0x1);
-+}
-+
-+
-+volatile sig_atomic_t sigtermed = 0;
-+
-+void my_signal_handler(int signum)
-+{
-+      if (signum == SIGTERM || signum == SIGINT) {
-+              sigtermed = 1;
-+      }
-+}
-+
-+struct sort
-+{
-+      int pos;
-+      double value;
-+};
-+
-+
-+void *ctx;
-+struct time_graph_create_params p;
-+char xpos_string[100], ypos_string[100];
-+
-+void mpu_handler(int command)
-+{
-+#if 1
-+        static int fd;
-+        char buf[1000];
-+        char * tabledata= "/tmp/statcollfifo";
-+        int i;
-+        int bytes;
-+        static int offset = 13;
-+
-+        switch(command)
-+        {
-+                case OPEN:
-+                        fd = open(tabledata, O_RDONLY|O_NONBLOCK);
-+                        break;
-+
-+                case READ:
-+
-+                        /* open, read, and display the message from the FIFO */
-+                        bytes=read(fd, buf, 1000);
-+                        if(bytes > 0)
-+                        {
-+                                char str[100];
-+                                char value[100];
-+                                sscanf(buf, "%s %s", str, value);
-+                                if(strcmp(str, "MOVE:") == 0)
-+                                {
-+                                        printf("Received MOVE command : %s\n", buf);
-+                                        sprintf(p.title, "CPU Usage[@position-req=%sx%s]", value, ypos_string);
-+                                        move_graph(ctx, &p);
-+                                }
-+                                else
-+                                {
-+                                        printf("ERROR: Received unexpected data from FIFO - \" %s \" \n", buf);
-+                                }
-+                                memset(buf, 0x0, sizeof(buf));
-+                        }
-+
-+                        break;
-+
-+                case CLOSE:
-+                        close(fd);
-+                        break;
-+        }
-+#endif
-+        return;
-+}
-+
-+
-+UInt32 statcoll_start(UInt32 TOTAL_TIME, UInt32 INTERVAL_US, char list[][50], UInt32 xpos, UInt32 ypos)
-+{
-+    int i, fd, index;
-+    UInt32 counterIdDss, counterIdIva, counterIdBB2dP1, counterIdBB2dP2, counterIdUsb4, counterIdSata, counterIdEmif1, counterIdEmif2;
-+
-+    if (SIG_ERR == signal(SIGPIPE,SIG_IGN))
-+          exit(1);
-+
-+    if (SIG_ERR == signal(SIGINT,my_signal_handler))
-+          exit(1);
-+
-+    if (SIG_ERR == signal(SIGTERM,my_signal_handler))
-+          exit(1);
-+
-+  
-+    struct timeval tv1, tv2;
-+    gettimeofday(&tv1, NULL);
-+    printf("------------------------------------------------\n");
-+    printf("Compile time = %s %s\n",__DATE__,  __TIME__);
-+    printf("------------------------------------------------\n\n");
-+    //printd("Start time = %d\n", time(NULL));
-+    //printd("Time seconds = %d, usecs = %d\n", tv.tv_sec, tv.tv_usec);
-+
-+    statcoll_params params;
-+    memset(&params, sizeof(params), 0);
-+    params.INTERVAL_US = INTERVAL_US;
-+    params.TOTAL_TIME = TOTAL_TIME;
-+
-+    i=0;
-+    index=0;
-+
-+    while(list[i][0] != 0)
-+    {
-+      for(index=0; index< STATCOL_MAX; index++) {
-+              if(strcmp(list[i], initiators[index].name) == 0)
-+              {
-+                      strcpy(params.user_config_list[params.no_of_initiators].name, list[i]);
-+                      params.user_config_list[params.no_of_initiators++].id = initiators[index].id;
-+                      break;
-+              }
-+      }
-+
-+      if(index == STATCOL_MAX) {
-+              printf("ERROR: Unknown initiator.%d.. .%s. \n", i, list[i]);
-+              //exit(0);
-+      }
-+        i++;
-+    }
-+
-+      struct bar_graph_create_params bg_p;
-+      struct _y_config *y_cfg;
-+      struct _text_config *t_cfg;
-+      double *y;
-+      double *bg_y;
-+        char *text_list[STATCOL_MAX];
-+
-+        struct _bar_graph_y_config *bg_y_cfg;
-+        struct _text_config *bg_t_cfg;
-+      char *bg_text_list[STATCOL_MAX];
-+      
-+      sprintf(xpos_string, "%d", xpos);
-+      sprintf(ypos_string, "%d", ypos);
-+      p.title=(char *)malloc(100);
-+      sprintf(p.title, "CPU Usage[@position-req=%sx%s]", xpos_string, ypos_string);
-+      //p.height = MAX_HEIGHT - HEIGHT_EMIF_AREA;
-+      p.height = MAX_HEIGHT;// - HEIGHT_EMIF_AREA;
-+      p.width = MAX_WIDTH;
-+      p.draw_area.bottom_left.x = TIME_GRAPH_AREA_BL_X;
-+      p.draw_area.bottom_left.y = TIME_GRAPH_AREA_BL_Y;
-+      p.draw_area.top_right.x = TIME_GRAPH_AREA_TR_X;
-+      p.draw_area.top_right.y = TIME_GRAPH_AREA_TR_Y;
-+      p.time_span = 120000; // 120 seconds
-+      p.num_of_y_items = params.no_of_initiators+1;
-+      p.num_of_text_items = 0;//params.no_of_initiators;
-+
-+
-+      y_cfg = malloc((params.no_of_initiators+1) * sizeof(struct _y_config));
-+      t_cfg = malloc(params.no_of_initiators * sizeof(struct _text_config));
-+      y = malloc((params.no_of_initiators+1) * sizeof(double));
-+      p.y_config_array = y_cfg;
-+      p.text_config_array = t_cfg;
-+
-+      bg_y_cfg = malloc(TOTAL_Y_PARAMETERS * sizeof(struct _bar_graph_y_config));
-+      bg_t_cfg = malloc(TOTAL_Y_PARAMETERS * sizeof(struct _text_config));
-+      bg_y = malloc(TOTAL_Y_PARAMETERS * sizeof(double));
-+
-+       for(i=0; i<TOTAL_Y_PARAMETERS; i++)
-+       {
-+               bg_text_list[i] = malloc(100);
-+               strcpy(bg_text_list[i],"test");
-+       }
-+
-+       create_overall_box(bg_y_cfg, bg_t_cfg, bg_text_list);
-+
-+
-+      i=0;
-+      while(i < params.no_of_initiators)
-+      {
-+              text_list[i] = malloc(100 * sizeof(char));
-+              memset(text_list[i], 0x0, 100);
-+
-+              ((struct _y_config *)y_cfg+i)->line_color.r = pallette[i%MAX_COLORS].r;
-+              ((struct _y_config *)y_cfg+i)->line_color.g = pallette[i%MAX_COLORS].g;
-+              ((struct _y_config *)y_cfg+i)->line_color.b = pallette[i%MAX_COLORS].b;
-+              ((struct _y_config *)y_cfg+i)->line_color.a = 0.0;//pallette[i%MAX_COLORS].a;
-+              
-+              ((struct _y_config *)y_cfg+i)->fill_color.r = 0.0;
-+              ((struct _y_config *)y_cfg+i)->fill_color.g = 1.0;
-+              ((struct _y_config *)y_cfg+i)->fill_color.b = 0.0;
-+              ((struct _y_config *)y_cfg+i)->fill_color.a = 0.5;
-+              
-+              i++;
-+      }
-+
-+      ((struct _y_config *)y_cfg+i)->line_color.r = 0.0;
-+      ((struct _y_config *)y_cfg+i)->line_color.g = 0.0;
-+      ((struct _y_config *)y_cfg+i)->line_color.b = 0.0;
-+      ((struct _y_config *)y_cfg+i)->line_color.a = 0.5;
-+      ((struct _y_config *)y_cfg+i)->fill_color.r = 0.1;
-+      ((struct _y_config *)y_cfg+i)->fill_color.g = 0.9;
-+      ((struct _y_config *)y_cfg+i)->fill_color.b = 0.5;
-+      ((struct _y_config *)y_cfg+i)->fill_color.a = 1.0;
-+
-+        bg_p.title = "CPU Usage";
-+      
-+        bg_p.num_of_y_items = TOTAL_Y_PARAMETERS;
-+        bg_p.y_config_array = bg_y_cfg;
-+        bg_p.num_of_text_items = TOTAL_Y_PARAMETERS;
-+        bg_p.text_config_array = bg_t_cfg;
-+
-+
-+      int argc;
-+      char *argv[10];
-+      ctx = time_graph_create(argc, argv, &p);
-+      if (!ctx) {
-+              printf("Error creating context\n");
-+              exit(0);
-+      }
-+
-+      printf("\n Context after time_graph_create = 0x%x\n", ctx);
-+      ctx = bar_graph_create(argc, argv, &bg_p);
-+      if (!ctx) {
-+              printf("Error creating context\n");
-+              exit(0);
-+      }
-+
-+      printf("\n Context after bar_graph_create= 0x%x\n", ctx);
-+
-+    printf("Total configured initiators = %d\n", params.no_of_initiators);
-+      
-+
-+    fd = open("/dev/mem", O_RDWR);
-+    if (fd == -1){
-+       printf("error fd=open() \n");     
-+       return -1;
-+    }
-+    statcoll_base_mem = mmap(NULL, STATCOLL_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, STATCOLL_BASE);
-+    
-+   if (statcoll_base_mem == MAP_FAILED){
-+        printf("ERROR: mmap failed \n");
-+        return;
-+    }
-+    close(fd);
-+
-+    fd = open("/dev/mem", O_RDWR);
-+    if (fd == -1){
-+       printf("error fd=open() \n");     
-+       return -1;
-+    }
-+    l3_3_clkctrl = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CM_L3INSTR_REGISTER_BASE);
-+    if (l3_3_clkctrl == MAP_FAILED){
-+        printf("ERROR: mmap failed for CM_L3INSTR_REGISTER_BASE\n");
-+        return;
-+    }
-+    close(fd);
-+
-+    printf("SUCCESS: Mapped 0x%x to user space address 0x%x\n", STATCOLL_BASE, statcoll_base_mem);
-+    printf("INTERVAL = %d usecs\n", INTERVAL_US);
-+    printf("TOTAL TIME = %d seconds\n", TOTAL_TIME);
-+    TRACE_SZ = (TOTAL_TIME * 1000000)/INTERVAL_US;
-+    printf("TRACE SIZE = %d samples\n", TRACE_SZ);
-+
-+    printf("**************************************\n");
-+    printf("Going to initialize the L3 clocks \n"); 
-+    l3_3_clkctrl[CM_L3INSTR_L3INSTR_CLKSTCTRL_OFFSET >> 2] = 0x2;
-+    l3_3_clkctrl[CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET >> 2] = 0x1;
-+    printf("**************************************\n");
-+
-+    while( (l3_3_clkctrl[CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET >> 2] & 0x30000) != 0x0) 
-+    {
-+      printf("Waiting on module to be functional\n");
-+    }
-+
-+    statCollectorInit();
-+
-+    printf("SUCCESS: Initialized STAT COLLECTOR\n");
-+    /* Initialize all enabled initiators */
-+    for(index =0; index < params.no_of_initiators; index++) {
-+        printf("\t\t Initialized %s\n", params.user_config_list[index].name);
-+        statCollectorControlInitialize(params.user_config_list[index].id);
-+    }
-+
-+      const char *bg_text = "CPU Utilization";
-+
-+    int second_counter=0;
-+    memset(y, 0x0, sizeof(double)* (params.no_of_initiators+1));
-+
-+
-+
-+
-+    mpu_handler(OPEN);
-+
-+
-+    while(statCountIdx != (TRACE_SZ - 1))
-+    {
-+        usleep(INTERVAL_US);
-+        int group;
-+      for(group = 1; group<11; group++)
-+              statCollectorReadGroup(group);
-+
-+        mpu_handler(READ);
-+
-+      if(statCountIdx != 0 ) 
-+      for(i=0; i<params.no_of_initiators; i++) {
-+              y[i] += (double)(global_object[params.user_config_list[i].id].readings[statCountIdx])/ (8000000000);
-+      }
-+      second_counter++;
-+
-+      if(second_counter % 30 == 0)
-+      {
-+              
-+              for(i=0; i<TOTAL_Y_PARAMETERS; i++) {
-+                      bg_y[i] = 1.0;
-+              }
-+
-+              //HACK
-+              bg_y[9]=y[0]*2;
-+              bg_y[11]=y[1]*2;
-+              sprintf(bg_text_list[8], "%02.1f%s", y[0]*100, "%");
-+              sprintf(bg_text_list[10], "%02.1f%s", y[1]*100, "%");
-+
-+              struct sort sort_array[STATCOL_MAX];
-+              memset(sort_array, 0x0, sizeof(struct sort) * STATCOL_MAX);
-+              /* Sort here */
-+              for(i=2; i<params.no_of_initiators; i++) {
-+                      sort_array[i-2].value = y[i];
-+                      sort_array[i-2].pos = i;
-+              }
-+
-+              int j;
-+              double tempdouble;
-+              int tempint;
-+              for(i=0; i<params.no_of_initiators-2; i++) {
-+                      for(j=i+1; j<params.no_of_initiators-2; j++) { 
-+                              if(sort_array[i].value < sort_array[j].value) {
-+                                      tempdouble = sort_array[j].value;
-+                                      tempint = sort_array[j].pos;
-+ 
-+                                      sort_array[j].value  = sort_array[i].value;
-+                                      sort_array[j].pos    = sort_array[i].pos;
-+
-+                                      sort_array[i].value = tempdouble;
-+                                      sort_array[i].pos   = tempint;
-+                              }
-+                      }
-+              }
-+
-+              for(i=0; i<6; i++)
-+              {
-+                      //HACK
-+                      bg_y[14+i*2] = sort_array[i].value*2;
-+                      sprintf(bg_text_list[13+i*2], "%02.1f%s", sort_array[i].value*100, "%");
-+                      sprintf(bg_text_list[14+i*2], "%s", (params.user_config_list[sort_array[i].pos].name)+8);
-+              }
-+
-+                bar_graph_plot(ctx, bg_y, (const char **)bg_text_list);
-+
-+              y[params.no_of_initiators]=y[0]+y[1];
-+              time_graph_plot(ctx, y, (const char **)text_list);
-+              //printf("Plotting the time_graph\n");
-+              memset(y, 0x0, sizeof(double)* (params.no_of_initiators+1));
-+      }
-+      statCountIdx++;
-+
-+    }
-+    
-+    mpu_handler(CLOSE);
-+
-+    printf("------------------------------------------------\n\n");
-+    printf("SUCCESS: Stat collection completed... Writing into file now\n");
-+    FILE *outfile = fopen("statcollector.csv", "w+");
-+    if (!outfile) {
-+        printf("\n ERROR: Error opening file");
-+    }
-+
-+    /* Ignore the first index at 0 */
-+    for(index=1; index<statCountIdx; index++) {
-+          for(i=0; i<params.no_of_initiators; i++) {
-+                  fprintf(outfile,"%s = %d,", params.user_config_list[i].name, global_object[params.user_config_list[i].id].readings[index]);
-+          }
-+          fprintf(outfile,"\n"); 
-+    }
-+    fclose(outfile);
-+
-+      time_graph_destroy(ctx);
-+    gettimeofday(&tv2, NULL);
-+    //printf("End time = %d\n", time(NULL));
-+    //printf("Time seconds = %d, usecs = %d\n", tv.tv_sec, tv.tv_usec);
-+    printf("Total execution time = %d secs, %d usecs\n\n", (tv2.tv_sec - tv1.tv_sec), (tv2.tv_usec - tv2.tv_usec));
-+
-+    return 0;
-+}
-+
-+
-diff --git a/clients/statcoll.h b/clients/statcoll.h
-new file mode 100644
-index 0000000..fa92753
---- /dev/null
-+++ b/clients/statcoll.h
-@@ -0,0 +1,152 @@
-+#ifndef __STATCOLL_H 
-+#define __STATCOLL_H
-+ 
-+
-+#define CM_L3INSTR_REGISTER_BASE           (0x4A008000)
-+
-+#define CM_L3INSTR_L3INSTR_CLKSTCTRL_OFFSET     (0xE00)
-+#define CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET     (0xE20)
-+
-+#define STATCOLL_SIZE 40960
-+#define STATCOLL_BASE (0x45001000)
-+
-+#define stat_coll0_base_address (0x45001000)
-+#define stat_coll1_base_address (0x45002000)
-+#define stat_coll2_base_address (0x45003000)
-+#define stat_coll3_base_address (0x45004000)
-+#define stat_coll4_base_address (0x45005000)
-+#define stat_coll5_base_address (0x45006000)
-+#define stat_coll6_base_address (0x45007000)
-+#define stat_coll7_base_address (0x45008000)
-+#define stat_coll8_base_address (0x45009000)
-+#define stat_coll9_base_address (0x4500a000)
-+
-+#define printd(fmt, ...) \
-+      do { if (debug) fprintf(stderr, fmt, __VA_ARGS__); } while (0)
-+
-+typedef unsigned int UInt32;
-+
-+
-+typedef enum
-+{
-+    STATCOL_EMIF1_SYS,
-+    STATCOL_EMIF2_SYS,
-+    STATCOL_MA_MPU_P1,
-+    STATCOL_MA_MPU_P2,
-+    STATCOL_MPU1,
-+    STATCOL_MMU1,
-+    STATCOL_TPTC_RD1,
-+    STATCOL_TPTC_WR1,
-+    STATCOL_TPTC_RD2,
-+    STATCOL_TPTC_WR2,
-+    STATCOL_VIP1_P1,
-+    STATCOL_VIP1_P2,
-+    STATCOL_VIP2_P1,
-+    STATCOL_VIP2_P2,
-+    STATCOL_VIP3_P1,
-+    STATCOL_VIP3_P2,
-+    STATCOL_VPE_P1,
-+    STATCOL_VPE_P2,
-+    STATCOL_EVE1_TC0,
-+    STATCOL_EVE1_TC1,
-+    STATCOL_EVE2_TC0,
-+    STATCOL_EVE2_TC1,
-+    STATCOL_EVE3_TC0,
-+    STATCOL_EVE3_TC1,
-+    STATCOL_EVE4_TC0,
-+    STATCOL_EVE4_TC1,
-+    STATCOL_DSP1_MDMA,
-+    STATCOL_DSP1_EDMA,
-+    STATCOL_DSP2_MDMA,
-+    STATCOL_DSP2_EDMA,
-+    STATCOL_IVA,
-+    STATCOL_GPU_P1,
-+    STATCOL_GPU_P2,
-+    STATCOL_BB2D_P1,
-+    STATCOL_DSS,
-+    STATCOL_CSI2_2,
-+    STATCOL_MMU2,
-+    STATCOL_IPU1,
-+    STATCOL_IPU2,
-+    STATCOL_DMA_SYSTEM_RD,
-+    STATCOL_DMA_SYSTEM_WR,
-+    STATCOL_CSI2_1,
-+    STATCOL_USB3_SS,
-+    STATCOL_USB2_SS,
-+    STATCOL_USB2_ULPI_SS1,
-+    STATCOL_USB2_ULPI_SS2,
-+    STATCOL_PCIE_SS1,
-+    STATCOL_PCIE_SS2,
-+    STATCOL_DSP1_CFG,
-+    STATCOL_DSP2_CFG,
-+    STATCOL_GMAC_SW,
-+    STATCOL_PRUSS1_P1,
-+    STATCOL_PRUSS1_P2,
-+    STATCOL_PRUSS2_P1,
-+    STATCOL_PRUSS2_P2,
-+    STATCOL_DMA_CRYPTO_RD,
-+    STATCOL_DMA_CRYPTO_WR,
-+    STATCOL_MPU2,
-+    STATCOL_MMC1,
-+    STATCOL_MMC2,
-+    STATCOL_SATA,
-+    STATCOL_MLBSS,
-+    STATCOL_BB2D_P2,
-+    STATCOL_IEEE1500,
-+    STATCOL_DBG,
-+    STATCOL_VCP1,
-+    STATCOL_OCMC_RAM1,
-+    STATCOL_OCMC_RAM2,
-+    STATCOL_OCMC_RAM3,
-+    STATCOL_GPMC,
-+    STATCOL_MCASP1,
-+    STATCOL_MCASP2,
-+    STATCOL_MCASP3,
-+    STATCOL_VCP2,
-+    STATCOL_MAX
-+} STATCOL_ID;
-+
-+
-+
-+typedef struct
-+{
-+    UInt32 stat0_filter_cnt;
-+    UInt32 stat1_filter_cnt;
-+    UInt32 stat2_filter_cnt;
-+    UInt32 stat3_filter_cnt;
-+    UInt32 stat4_filter_cnt;
-+    UInt32 stat5_filter_cnt;
-+    UInt32 stat6_filter_cnt;
-+    UInt32 stat7_filter_cnt;
-+    UInt32 stat8_filter_cnt;
-+    UInt32 stat9_filter_cnt;
-+} StatCollectorObj;
-+ 
-+struct list_of_initiators
-+{
-+   STATCOL_ID id;
-+   char name[50];    
-+};
-+
-+typedef struct 
-+{
-+    UInt32 INTERVAL_US;
-+    UInt32 TOTAL_TIME;
-+    UInt32 no_of_initiators;
-+    struct list_of_initiators user_config_list[STATCOL_MAX];
-+} statcoll_params;
-+
-+typedef struct
-+{
-+    UInt32 b_enabled;
-+    char name[100];
-+    UInt32 *readings;
-+    UInt32 *timestamp;
-+    UInt32 group_id;
-+    UInt32 counter_id;
-+    UInt32 base_address;
-+    UInt32 mux_req;
-+}statcoll_initiators_object;
-+
-+
-+#endif
-diff --git a/clients/statcoll_gui.h b/clients/statcoll_gui.h
-new file mode 100644
-index 0000000..7362bde
---- /dev/null
-+++ b/clients/statcoll_gui.h
-@@ -0,0 +1,101 @@
-+
-+/*
-+
-+ ---------------------------------------------
-+ |                                            |
-+ |  ---------------------------------------   |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ |                                            |
-+ ---------------------------------------------
-+ |           |                                |
-+ |           |                                |
-+ |           |                                |
-+ |           |                                |
-+ |           |                                |
-+ |           |                                |
-+ ---------------------------------------------
-+
-+
-+
-+
-+*/
-+#define POSITION_X 2800
-+#define POSITION_Y 40
-+
-+#define MAX_WIDTH  900
-+//#define MAX_WIDTH  528
-+#define MAX_HEIGHT 900
-+
-+/* Derived parameters */
-+#define BAR_GAP    (MAX_WIDTH/25)
-+#define BAR_WIDTH  (MAX_WIDTH/16)
-+
-+#define BAR_HEIGHT ((MX_HEIGHT/40) * 6)
-+
-+#define BORDER     (MAX_WIDTH/15)
-+
-+#define HEIGHT_EMIF_AREA (MAX_HEIGHT/4)
-+
-+#define FONT_SIZE (MAX_WIDTH/40)
-+
-+#define WIDTH_EMIF_AREA (MAX_WIDTH / 4)
-+
-+#define TOTAL_Y_PARAMETERS (25)
-+
-+#define TIME_GRAPH_AREA_BL_X (BORDER)
-+#define TIME_GRAPH_AREA_BL_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA - BORDER)
-+#define TIME_GRAPH_AREA_TR_X (MAX_WIDTH - BORDER)
-+#define TIME_GRAPH_AREA_TR_Y (BORDER)
-+
-+#define EMIF_AREA_BL_X (0)
-+#define EMIF_AREA_BL_Y (MAX_HEIGHT)
-+#define EMIF_AREA_TR_X (WIDTH_EMIF_AREA)
-+#define EMIF_AREA_TR_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA)
-+
-+#define INITIATORS_AREA_BL_X (WIDTH_EMIF_AREA)
-+#define INITIATORS_AREA_BL_Y (MAX_HEIGHT)
-+#define INITIATORS_AREA_TR_X (MAX_WIDTH)
-+#define INITIATORS_AREA_TR_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA)
-+
-+
-+const char *string_list[TOTAL_Y_PARAMETERS] = {
-+        "----DDR BANDWIDTH PLOT----",
-+        "8 GBPS",
-+        "6.4 ",
-+        "4.8",
-+        "3.2",
-+        "1.6",
-+        "0",
-+        "EMIF Plot",
-+        "test",
-+        "EMIF1",
-+        "test",
-+        "EMIF2",
-+        "TOP 6 INITIATORS",
-+        "test",
-+        "MPU",
-+        "test",
-+        "DSS",
-+        "test",
-+        "DSP",
-+        "test",
-+        "IVA",
-+        "test",
-+        "GPU",
-+        "test",
-+        "BB2D",
-+};
-+
-diff --git a/clients/time_bar_graph.c b/clients/time_bar_graph.c
-new file mode 100644
-index 0000000..9fa9c12
---- /dev/null
-+++ b/clients/time_bar_graph.c
-@@ -0,0 +1,515 @@
-+/*
-+ * Copyright Â© 2008 Kristian Høgsberg
-+ *
-+ * Permission to use, copy, modify, distribute, and sell this software and its
-+ * documentation for any purpose is hereby granted without fee, provided that
-+ * the above copyright notice appear in all copies and that both that copyright
-+ * notice and this permission notice appear in supporting documentation, and
-+ * that the name of the copyright holders not be used in advertising or
-+ * publicity pertaining to distribution of the software without specific,
-+ * written prior permission.  The copyright holders make no representations
-+ * about the suitability of this software for any purpose.  It is provided "as
-+ * is" without express or implied warranty.
-+ *
-+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-+ * OF THIS SOFTWARE.
-+ */
-+
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdint.h>
-+#include <signal.h>
-+#include <time.h>
-+#include <math.h>
-+#include <cairo.h>
-+#include <sys/time.h>
-+#include <pthread.h>
-+#include <errno.h>
-+#include <unistd.h>
-+#include <sys/eventfd.h>
-+#include <sys/epoll.h>
-+
-+#include <linux/input.h>
-+#include <wayland-client.h>
-+#include "window.h"
-+#include "../shared/cairo-util.h"
-+#include "time_bar_graph.h"
-+
-+//#define DEBUG 1
-+#ifdef DEBUG 
-+#define DBG(x...) printf(x)
-+#else
-+#define DBG(x...) // printf(x)
-+#endif
-+
-+#define MAX_ITEMS        180
-+#define MAX_TEXT_SIZE    128
-+
-+struct graph_dataset_point {
-+      int next_index;
-+      double y_values[MAX_ITEMS];
-+};
-+
-+struct graph_data {
-+      int dataset_size;
-+      int first_index, last_index, num_elems;
-+      uint64_t last_time;
-+      struct graph_dataset_point dataset[1];
-+};
-+
-+struct graph {
-+      struct display *display;
-+      struct window *window;
-+      struct widget *widget;
-+      int width, height;
-+      struct time_graph_create_params params;
-+      struct bar_graph_create_params bar_graph_params;
-+      struct _y_config y_config_array[MAX_ITEMS];
-+      struct _text_config text_config_array[MAX_ITEMS];
-+
-+      /* Bar graph parameters */
-+      struct _bar_graph_y_config bar_graph_y_config_array[MAX_ITEMS];
-+      struct _text_config bar_graph_text_config_array[MAX_ITEMS];
-+
-+      pthread_t thr;
-+      int eventfd;
-+      struct task task;
-+      double x_scaling_factor;
-+      pthread_mutex_t mtx;
-+      double time_graph_y_values[MAX_ITEMS];
-+      char text_values[MAX_ITEMS][MAX_TEXT_SIZE];
-+
-+      double bar_graph_y_values[MAX_ITEMS];
-+      char bar_graph_text_values[MAX_ITEMS][MAX_TEXT_SIZE];
-+
-+      uint64_t time_now;
-+      time_t start_time_tv_sec;
-+      struct graph_data *data;
-+};
-+
-+struct graph *global_graph=NULL;
-+static void
-+draw_stuff(struct graph *g, cairo_surface_t *surface)
-+{
-+      cairo_t *cr;
-+      int i, j, n_elems;
-+      double c_x, c_y, d_x, d_y;
-+
-+      cr = cairo_create(surface);
-+      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
-+      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.5);
-+      cairo_paint(cr);
-+      cairo_select_font_face(cr, "mono",
-+                      CAIRO_FONT_SLANT_NORMAL,
-+                      CAIRO_FONT_WEIGHT_BOLD);
-+      cairo_set_line_width (cr, 1.0);
-+      cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
-+      pthread_mutex_lock(&g->mtx);
-+      for (j=0; g->data->num_elems > 0 && j<g->params.num_of_y_items; j++) {
-+              n_elems = g->data->num_elems;
-+              DBG("first_index: %d, last_index: %d\n", g->data->first_index, g->data->last_index);
-+              if (g->y_config_array[j].fill_color.a != 0.0)
-+                      cairo_move_to(cr, (double)g->params.draw_area.bottom_left.x, (double)g->params.draw_area.bottom_left.y);
-+              c_x = (double)g->params.draw_area.bottom_left.x;
-+              c_y = (double)g->params.draw_area.bottom_left.y;
-+              d_x = 0;
-+              i = g->data->first_index;
-+              while (n_elems) {
-+                      DBG("index: %d, x: %f, y: %f, next_index: %d\n", i, c_x,
-+                              g->data->dataset[i].y_values[j], g->data->dataset[i].next_index);
-+                      d_y = g->data->dataset[i].y_values[j] - c_y;
-+                      c_y = g->data->dataset[i].y_values[j];
-+                      c_x = c_x + d_x;
-+                      if (g->y_config_array[j].fill_color.a == 0.0 && n_elems == g->data->num_elems) {
-+                              cairo_move_to(cr, c_x, c_y);
-+                      } else {
-+                              cairo_curve_to(cr, c_x - (d_x * 0.75), c_y - (d_y * 0.92), c_x - (d_x * 0.25), c_y - (d_y * 0.08), c_x, c_y);
-+                      }
-+                      if (g->data->dataset[i].next_index > i) {
-+                              d_x = (g->data->dataset[i].next_index - i);
-+                      } else {
-+                              d_x = (g->data->dataset_size + g->data->dataset[i].next_index - i);
-+                      }
-+                      i = g->data->dataset[i].next_index;
-+                      n_elems--;
-+              }
-+              if (g->y_config_array[j].fill_color.a != 0.0) {
-+                      cairo_line_to(cr, c_x, (double)g->params.draw_area.bottom_left.y);
-+                      cairo_line_to(cr, (double)g->params.draw_area.bottom_left.x, (double)g->params.draw_area.bottom_left.y);
-+                      cairo_close_path(cr);
-+                      cairo_set_source_rgba(cr, g->y_config_array[j].fill_color.r, g->y_config_array[j].fill_color.g, 
-+                                      g->y_config_array[j].fill_color.b, g->y_config_array[j].fill_color.a);
-+                      cairo_fill_preserve(cr);
-+              }
-+              cairo_set_source_rgba(cr, g->y_config_array[j].line_color.r, g->y_config_array[j].line_color.g, 
-+                      g->y_config_array[j].line_color.b, g->y_config_array[j].line_color.a);
-+              cairo_stroke(cr);
-+      }
-+
-+      for (j=0; j<g->params.num_of_text_items; j++) {
-+              cairo_move_to(cr, (double)g->text_config_array[j].at.x, (double)g->text_config_array[j].at.y);
-+              cairo_set_font_size(cr, g->text_config_array[j].fontsize);
-+              cairo_set_source_rgba(cr, g->text_config_array[j].color.r, g->text_config_array[j].color.g, 
-+                              g->text_config_array[j].color.b, g->text_config_array[j].color.a);
-+              cairo_show_text(cr, g->text_values[j]);
-+      }
-+
-+      
-+      for (j=0; j<g->bar_graph_params.num_of_y_items; j++) {
-+              cairo_move_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x,
-+                      (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y);
-+              c_y = (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y -
-+                  (g->bar_graph_y_values[j] * (double)(g->bar_graph_params.y_config_array[j].region.bottom_left.y -
-+                      g->bar_graph_params.y_config_array[j].region.top_right.y));
-+              cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x, c_y);
-+              cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.top_right.x, c_y);
-+              cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.top_right.x,
-+                      (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y);
-+              cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x,
-+                      (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y);
-+              cairo_close_path(cr);
-+              cairo_set_source_rgba(cr, g->bar_graph_y_config_array[j].fill_color.r, g->bar_graph_y_config_array[j].fill_color.g, 
-+                              g->bar_graph_y_config_array[j].fill_color.b, g->bar_graph_y_config_array[j].fill_color.a);
-+              cairo_fill_preserve(cr);
-+              cairo_set_source_rgba(cr, g->bar_graph_y_config_array[j].line_color.r, g->bar_graph_y_config_array[j].line_color.g, 
-+                      g->bar_graph_y_config_array[j].line_color.b, g->bar_graph_y_config_array[j].line_color.a);
-+              cairo_stroke(cr);
-+      }
-+      for (j=0; j<g->bar_graph_params.num_of_text_items; j++) {
-+              cairo_move_to(cr, (double)g->bar_graph_text_config_array[j].at.x, (double)g->bar_graph_text_config_array[j].at.y);
-+              cairo_set_font_size(cr, g->bar_graph_text_config_array[j].fontsize);
-+              cairo_set_source_rgba(cr, g->bar_graph_text_config_array[j].color.r, g->bar_graph_text_config_array[j].color.g, 
-+                              g->bar_graph_text_config_array[j].color.b, g->bar_graph_text_config_array[j].color.a);
-+                cairo_save (cr);
-+              //cairo_rotate(cr, 2*3.14*21/24);
-+              cairo_show_text(cr, g->bar_graph_text_values[j]);
-+              cairo_restore(cr);
-+      }
-+      pthread_mutex_unlock(&g->mtx);
-+      cairo_destroy(cr);
-+}
-+
-+static void
-+resize_handler(struct widget *widget,
-+             int32_t width, int32_t height, void *data)
-+{
-+      struct graph *g = data;
-+
-+      /* Dont resize me */
-+      widget_set_size(g->widget, g->width, g->height);
-+}
-+
-+static void
-+redraw_handler(struct widget *widget, void *data)
-+{
-+      struct graph *g = data;
-+      cairo_surface_t *surface;
-+
-+      surface = window_get_surface(g->window);
-+      if (surface == NULL ||
-+          cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
-+              fprintf(stderr, "failed to create cairo egl surface\n");
-+              return;
-+      }
-+
-+      draw_stuff(g, surface);
-+      cairo_surface_destroy(surface);
-+}
-+
-+static void
-+button_handler(struct widget *widget,
-+             struct input *input, uint32_t time,
-+             uint32_t button, enum wl_pointer_button_state state, void *data)
-+{
-+      struct graph *g = data;
-+
-+      switch (button) {
-+      case BTN_LEFT:
-+              if (state == WL_POINTER_BUTTON_STATE_PRESSED)
-+                      window_move(g->window, input,
-+                                  display_get_serial(g->display));
-+              break;
-+      case BTN_MIDDLE:
-+              if (state == WL_POINTER_BUTTON_STATE_PRESSED)
-+                      widget_schedule_redraw(widget);
-+              break;
-+      case BTN_RIGHT:
-+              if (state == WL_POINTER_BUTTON_STATE_PRESSED)
-+                      window_show_frame_menu(g->window, input, time);
-+              break;
-+      }
-+}
-+
-+static void
-+touch_down_handler(struct widget *widget, struct input *input, 
-+                 uint32_t serial, uint32_t time, int32_t id, 
-+                 float x, float y, void *data)
-+{
-+      struct graph *g = data;
-+      window_move(g->window, input, display_get_serial(g->display));
-+}
-+
-+static void task_run(struct task *task, uint32_t events)
-+{
-+      eventfd_t e;
-+      struct graph *g = (struct graph *)(task->link.prev);
-+      uint64_t time_diff;
-+      int elems, tmp, incr, i;
-+      double y;
-+
-+      eventfd_read(g->eventfd, &e);
-+      if(e == 1) {
-+              pthread_mutex_lock(&g->mtx);
-+              /* Process new data */
-+              DBG("time_now: %llu, last_time: %llu\n", g->time_now, g->data->last_time);
-+              if (g->time_now > g->data->last_time) {
-+                      time_diff = g->time_now - g->data->last_time;
-+                      y = (double)time_diff * g->x_scaling_factor;
-+                      incr = (int)y;
-+                      DBG("incr: %d\n", incr);
-+
-+                      if (g->data->last_index >= g->data->first_index) elems = g->data->last_index - g->data->first_index + 1;
-+                      else elems = g->data->dataset_size - g->data->first_index + g->data->last_index + 1;
-+                      /* Move first index to make room for new element */
-+                      while (g->data->dataset_size > 0 && (elems + incr) > g->data->dataset_size) {
-+                              tmp = g->data->dataset[g->data->first_index].next_index - g->data->first_index;
-+                              if (tmp < 0) tmp = g->data->dataset_size + tmp;
-+                              g->data->first_index = g->data->dataset[g->data->first_index].next_index;
-+                              elems -= tmp;
-+                              g->data->num_elems--;
-+                      }
-+                      for (i=0; i<g->params.num_of_y_items; i++) {
-+                              /* Scale Y */
-+                              y = g->time_graph_y_values[i] * (double)(g->params.draw_area.bottom_left.y-g->params.draw_area.top_right.y);
-+                              y = (double)g->params.draw_area.bottom_left.y - y;
-+                              g->data->dataset[g->data->last_index].y_values[i] = y;
-+                      }
-+                      g->data->dataset[g->data->last_index].next_index = g->data->last_index + incr;
-+                      if (g->data->dataset[g->data->last_index].next_index >= g->data->dataset_size) 
-+                              g->data->dataset[g->data->last_index].next_index -= g->data->dataset_size;
-+                      g->data->num_elems++;
-+                      g->data->last_index = g->data->dataset[g->data->last_index].next_index;
-+                      g->data->last_time = g->time_now;
-+              }
-+              pthread_mutex_unlock(&g->mtx);
-+      }
-+      widget_schedule_redraw(g->widget);
-+      DBG("event task ran...\n");
-+}
-+
-+void *time_graph_create(int argc, char *argv[], struct time_graph_create_params *cp)
-+{
-+      struct graph *g;
-+      struct display *d;
-+      int dataset_size;
-+      struct timeval tv;
-+
-+      if (cp->num_of_y_items > MAX_ITEMS) return NULL;
-+      if (cp->num_of_text_items > MAX_ITEMS) return NULL;
-+
-+      g = (struct graph*)malloc(sizeof(struct graph));
-+      if (g == NULL) {
-+              fprintf(stderr, "failed to allocate memory\n");
-+              return NULL;
-+      }
-+      global_graph = g;
-+      g->params = *cp;
-+      if (cp->num_of_y_items)
-+              memcpy(&g->y_config_array[0], cp->y_config_array,
-+                      sizeof(struct _y_config) * cp->num_of_y_items);
-+      if (cp->num_of_text_items)
-+              memcpy(&g->text_config_array[0], cp->text_config_array,
-+                      sizeof(struct _text_config) * cp->num_of_text_items);
-+      d = display_create(&argc, argv);
-+      if (d == NULL) {
-+              fprintf(stderr, "failed to create display: %m\n");
-+              return NULL;
-+      }
-+      g->display = d;
-+      //g->bg_image = load_cairo_surface(cp->bg_image);
-+      g->width = cp->width; //cairo_image_surface_get_width(g->bg_image);
-+      g->height = cp->height; //cairo_image_surface_get_height(g->bg_image);
-+      dataset_size = cp->draw_area.top_right.x - cp->draw_area.bottom_left.x;
-+      g->data = (struct graph_data *)malloc(sizeof(struct graph_data) +
-+              (dataset_size * sizeof(struct graph_dataset_point)));
-+      if (!g->data) {
-+              fprintf(stderr, "failed to allocate memory\n");
-+              display_destroy(g->display);
-+              //cairo_surface_destroy(g->bg_image);
-+              free(g);
-+              return NULL;
-+      }
-+      g->data->first_index = 0;
-+      g->data->last_index = 0;
-+      g->data->num_elems = 0;
-+      g->data->dataset_size = dataset_size;
-+      g->x_scaling_factor = (double)dataset_size / (double)cp->time_span;
-+      g->window = window_create(d);
-+      g->widget = window_add_widget(g->window, g);
-+      window_set_title(g->window, cp->title);
-+      widget_set_resize_handler(g->widget, resize_handler);
-+      widget_set_redraw_handler(g->widget, redraw_handler);
-+      widget_set_button_handler(g->widget, button_handler);
-+      widget_set_default_cursor(g->widget, CURSOR_HAND1);
-+      widget_set_touch_down_handler(g->widget, touch_down_handler);
-+      window_schedule_resize(g->window, g->width, g->height);
-+      g->eventfd = eventfd(0, 0);
-+      g->task.run = task_run;
-+      g->task.link.prev = (struct wl_list*)g;
-+      g->task.link.next = NULL;
-+      display_watch_fd(d, g->eventfd, EPOLLIN, &g->task);
-+      pthread_mutex_init(&g->mtx, NULL);
-+
-+      if (0 != pthread_create(&g->thr, NULL, (void *(*)(void *))display_run, (void *)d)) {
-+              fprintf(stderr, "pthread_create failed: %m\n");
-+              widget_destroy(g->widget);
-+              window_destroy(g->window);
-+              display_destroy(g->display);
-+              //cairo_surface_destroy(g->bg_image);
-+              free(g->data);
-+              close(g->eventfd);
-+              free(g);
-+              return NULL;
-+      }
-+      gettimeofday(&tv, NULL);
-+      g->start_time_tv_sec = tv.tv_sec;
-+      g->data->last_time = 0;
-+      return (void*)g;
-+}
-+
-+void move_graph(void *ctx, struct time_graph_create_params *cp)
-+{
-+      struct graph *g = ctx;
-+      window_set_title(g->window, cp->title);
-+}
-+
-+void time_graph_plot(void *ctx, double *y_values, const char *text_values[])
-+{
-+      struct timeval tv;
-+      struct graph *g = ctx;
-+      int i;
-+      pthread_mutex_lock(&g->mtx);
-+      gettimeofday(&tv, NULL);
-+      g->time_now = ((tv.tv_sec - g->start_time_tv_sec) * 1000) + (tv.tv_usec / 1000);
-+      memcpy(g->time_graph_y_values, y_values, g->params.num_of_y_items * sizeof(double));
-+      for (i=0;i<g->params.num_of_text_items; i++) {
-+              strncpy(g->text_values[i], text_values[i], MAX_TEXT_SIZE);
-+              g->text_values[i][MAX_TEXT_SIZE-1] = '\0';
-+      }
-+      pthread_mutex_unlock(&g->mtx);
-+      eventfd_write(g->eventfd, (eventfd_t)1);
-+}
-+
-+void time_graph_destroy(void *ctx)
-+{
-+      struct graph *g = (struct graph *)ctx;
-+      display_exit(g->display);
-+      eventfd_write(g->eventfd, (eventfd_t)1);
-+      pthread_join(g->thr, NULL);
-+      widget_destroy(g->widget);
-+      window_destroy(g->window);
-+      display_destroy(g->display);
-+      free(g->data);
-+      close(g->eventfd);
-+      free(g);
-+      global_graph=NULL;
-+}
-+
-+void util_get_cpu_usage(double *cpu_usage)
-+{
-+      static FILE *fp = NULL;
-+      char buf[256];
-+      uint64_t tot;
-+      uint64_t u, n, s, i, w, x, y, z;
-+      static uint64_t last_i = 0, last_total = 0;
-+
-+
-+      if (!fp) {
-+              if (!(fp = fopen("/proc/stat", "r")))
-+                      fprintf(stderr, "Failed /proc/stat open: %s", strerror(errno));
-+      }
-+      if (fp) {
-+              while (1) {
-+                      rewind(fp);
-+                      fflush(fp);
-+                      if (!fgets(buf, sizeof(buf), fp)) {
-+                              fprintf(stderr, "failed /proc/stat read\n");
-+                      } else {
-+                              sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
-+                                              &u,
-+                                              &n,
-+                                              &s,
-+                                              &i,
-+                                              &w,
-+                                              &x,
-+                                              &y,
-+                                              &z
-+                                        );
-+                              if (last_total == 0) {
-+                                      last_total = u+n+s+i+w+x+y+z;
-+                                      last_i = i;
-+                                      usleep(100000);
-+                              } else {
-+                                      tot = u+n+s+i+w+x+y+z;
-+                                      *cpu_usage = (1.0 - ((double)(i-last_i)/(double)(tot-last_total)));
-+                                      last_i = i;
-+                                      last_total = tot;
-+                                      break;
-+                              }
-+                      }
-+              }
-+      }
-+}
-+
-+void *bar_graph_create(int argc, char *argv[], struct bar_graph_create_params *cp)
-+{
-+      struct graph *g;
-+      struct display *d;
-+      struct timeval tv;
-+
-+      if (cp->num_of_y_items > MAX_ITEMS) return NULL;
-+      if (cp->num_of_text_items > MAX_ITEMS) return NULL;
-+
-+      if (global_graph == NULL) {
-+              fprintf(stderr, "graph not initialized invoke time_graph_create first\n");
-+              return NULL;
-+      }
-+      g=global_graph;
-+      g->bar_graph_params = *cp;
-+      if (cp->num_of_y_items)
-+              memcpy(&g->bar_graph_y_config_array[0], cp->y_config_array,
-+                      sizeof(struct _bar_graph_y_config) * cp->num_of_y_items);
-+      if (cp->num_of_text_items)
-+              memcpy(&g->bar_graph_text_config_array[0], cp->text_config_array,
-+                      sizeof(struct _text_config) * cp->num_of_text_items);
-+
-+      return g;
-+}
-+
-+void bar_graph_plot(void *ctx, double *y_values, const char *text_values[])
-+{
-+      struct graph *g = ctx;
-+      int i;
-+      pthread_mutex_lock(&g->mtx);
-+      memcpy(g->bar_graph_y_values, y_values, g->bar_graph_params.num_of_y_items * sizeof(double));
-+      for (i=0;i<g->bar_graph_params.num_of_text_items; i++) {
-+              strncpy(g->bar_graph_text_values[i], text_values[i], MAX_TEXT_SIZE);
-+              g->bar_graph_text_values[i][MAX_TEXT_SIZE-1] = '\0';
-+      }
-+      pthread_mutex_unlock(&g->mtx);
-+      //eventfd_write(g->eventfd, (eventfd_t)2);
-+}
-+
-+void bar_graph_destroy(void *ctx)
-+{
-+      printf("Nothing to be done for this call\n");
-+      return;
-+}
-+
-diff --git a/clients/time_bar_graph.h b/clients/time_bar_graph.h
-new file mode 100644
-index 0000000..97ac05a
---- /dev/null
-+++ b/clients/time_bar_graph.h
-@@ -0,0 +1,93 @@
-+
-+#ifndef _BAR_GRAPH_H_
-+#define _BAR_GRAPH_H_
-+
-+#include <stdint.h>
-+
-+struct _rgba {
-+      double r, g, b, a; // Values between 0 and 1
-+};
-+
-+struct _coordinate {
-+      uint32_t x, y; // Co-ordinates relative to top-left of the window
-+};
-+
-+struct _rect {
-+      struct _coordinate bottom_left, top_right;
-+};
-+
-+struct _y_config {
-+      struct _rgba line_color; // Line color
-+      struct _rgba fill_color; // Fill color, 0 alpha => no fill
-+};
-+
-+struct _text_config {
-+      struct _rgba color; // Color for drawing the text, RGBA
-+      struct _coordinate at; // where to draw the text
-+      int fontsize;         // Font size
-+};
-+
-+struct time_graph_create_params {
-+      char *title;
-+      //const char *bg_image;
-+      uint32_t width;
-+      uint32_t height;
-+      struct _rect draw_area;
-+      uint32_t time_span; // Amount of time the graph has to span in milliseconds
-+      uint32_t num_of_y_items;
-+      struct _y_config *y_config_array;
-+      uint32_t num_of_text_items;
-+      struct _text_config *text_config_array;
-+};
-+
-+
-+struct _bar_graph_y_config {
-+      struct _rect region;     // Region for the bar graph
-+      struct _rgba line_color; // Color for drawing the line, RGBA
-+      struct _rgba fill_color; // Fill under the line with color RGBA, 0 => no fill
-+};
-+
-+struct bar_graph_create_params {
-+      char *title;
-+      //const char *bg_image;
-+      uint32_t num_of_y_items;
-+      struct _bar_graph_y_config *y_config_array;
-+      uint32_t num_of_text_items;
-+      struct _text_config *text_config_array;
-+};
-+
-+/* Creates a time graph using create parameters */
-+void *bar_graph_create(int argc, char *argv[], struct bar_graph_create_params *cp);
-+
-+void move_graph(void *ctx, struct time_graph_create_params *cp);
-+
-+/* Plots a new set of y-values from the values in the array y_values. 
-+   The number of values must be equal to "num_of_y_items" from create params 
-+   y_values must be normalized between 0.0 to 1.0
-+*/
-+void bar_graph_plot(void *ctx, double *y_values, const char *text_values[]);
-+
-+/* Destroy the graph */
-+void bar_graph_destroy(void *ctx);
-+
-+
-+/* Creates a time graph using create parameters */
-+void *time_graph_create(int argc, char *argv[], struct time_graph_create_params *cp);
-+
-+/* 
-+ * Plots a new set of points from the values in the array y_values. 
-+ * The number of values in the array y_values must be equal to "num_of_y_items"
-+ * from create params 
-+ * y_values must be normalized between 0.0 to 1.0
-+
-+ * The number of values in the array text_values must be equal to "num_of_text_items"
-+ * from create params 
-+*/
-+void time_graph_plot(void *ctx, double *y_values, const char *text_values[]);
-+
-+/* Destroy the graph */
-+void time_graph_destroy(void *ctx);
-+
-+void util_get_cpu_usage(double *cpu_usage);
-+
-+#endif /* _BAR_GRAPH_H_ */
--- 
-1.9.1
-
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch
deleted file mode 100644 (file)
index 32901db..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-From 8034bc1862bbebb332e91917c6458ef8efb5b54e Mon Sep 17 00:00:00 2001
-From: Eric Ruei <e-ruei1@ti.com>
-Date: Fri, 8 Mar 2019 18:49:07 -0500
-Subject: [PATCH] weston: Fix virtual keyboard display issue for QT5 
- application
-
-The virtual keyboard does pop up as expected, however, it will never hide
-even when the application is terminated. This problem is due to the order
-of the text APIs( text_input_activate and test_input_show_input_panel) are
-invoked in QT5 and a potential bug of the API implementation. The virtual
-keyboard works as expected if the test_input_show_input_panel() is invoked
-prior to the test_input_activate() as most of the weston sample applications
-do. However, the problem will show up if that order is reversed and the reason
-why is that the current_panel is not set in this case and hence this panel
-cannot be hidden.
-
-It is required to set the current_panel to the text_input when the input_panel
-becomes visible at the first time.
-
-Upstream status: Pending
-
-Signed-off-by: Eric Ruei <e-ruei1@ti.com>
----
- compositor/text-backend.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/compositor/text-backend.c b/compositor/text-backend.c
-index 664c36f..b610dfb 100644
---- a/compositor/text-backend.c
-+++ b/compositor/text-backend.c
-@@ -349,6 +349,7 @@ text_input_show_input_panel(struct wl_client *client,
-                              text_input->surface);
-               wl_signal_emit(&ec->update_input_panel_signal,
-                              &text_input->cursor_rectangle);
-+              text_input->manager->current_text_input = text_input;
-       }
- }
--- 
-1.9.1
-
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch
deleted file mode 100644 (file)
index 4849d5b..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-From 60250e9dc57fe56148c8a24bba107bce8a873fb4 Mon Sep 17 00:00:00 2001
-From: Karthik Ramanan <a0393906@ti.com>
-Date: Mon, 12 Mar 2018 10:56:28 +0530
-Subject: [PATCH 4/4] weston: Fix touch screen crash issue
-
-Touch screen operation causes the weston to crash with segment fault sometimes.
-The crash occurs when the coordinate (x,y) passed to the weston input module
-is outside the view window, hence the weston compositor is not able to pick
-up a display view and there is no code to detect this condition at function
-notify_touch().
-
-Upstream status: pending
-
-Signed-off-by: Eric Ruei <e-ruei1@ti.com>
-Signed-off-by: Karthik Ramanan <a0393906@ti.com>
----
- libweston/input.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/libweston/input.c b/libweston/input.c
-index 4fedc55..bcb2f28 100644
---- a/libweston/input.c
-+++ b/libweston/input.c
-@@ -2185,6 +2185,12 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
-                * until all touch points are up again. */
-               if (touch->num_tp == 1) {
-                       ev = weston_compositor_pick_view(ec, x, y, &sx, &sy);
-+                      if (!ev)
-+                      {
-+                              weston_log("notify_touch: weston_compositor_pick_view(%d, %d) failed to find a view!\n",
-+                                                      wl_fixed_to_int(x), wl_fixed_to_int(y));
-+                              return;
-+                      }
-                       weston_touch_set_focus(touch, ev);
-               } else if (!touch->focus) {
-                       /* Unexpected condition: We have non-initial touch but
--- 
-1.9.1
-
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch
deleted file mode 100644 (file)
index 9b06b81..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-From db6f5ce008d9b8a4cc7db71659ce1d21d3d7f97f Mon Sep 17 00:00:00 2001
-From: Eric Ruei <e-ruei1@ti.com>
-Date: Tue, 26 Mar 2019 13:32:31 -0400
-Subject: [PATCH 3/3] weston: drm: fix dual display issue
-
-This patch fixes the dual display issue by enhancing the primary plane
-search algorithm to keep the plane which is connected to the crtc of
-the output because the direct switching of active planes is not allowed.
-
-Upstream status: Pending
-
-Signed-off-by: Eric Ruei <e-ruei1@ti.com>
----
- libweston/compositor-drm.c | 17 ++++++++++++++++-
- 1 file changed, 16 insertions(+), 1 deletion(-)
-
-diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
-index 3891176..fa694c3 100644
---- a/libweston/compositor-drm.c
-+++ b/libweston/compositor-drm.c
-@@ -428,6 +428,7 @@ struct drm_plane {
-       uint32_t possible_crtcs;
-       uint32_t plane_id;
-+      uint32_t crtc_id;
-       uint32_t count_formats;
-       struct drm_property_info props[WDRM_PLANE__COUNT];
-@@ -4073,6 +4074,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
-       if (kplane) {
-               plane->possible_crtcs = kplane->possible_crtcs;
-               plane->plane_id = kplane->plane_id;
-+              plane->crtc_id = kplane->crtc_id;
-               props = drmModeObjectGetProperties(b->drm.fd, kplane->plane_id,
-                                                  DRM_MODE_OBJECT_PLANE);
-@@ -4097,6 +4099,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
-       else {
-               plane->possible_crtcs = (1 << output->pipe);
-               plane->plane_id = 0;
-+              plane->crtc_id = 0;
-               plane->count_formats = 1;
-               plane->formats[0].format = format;
-               plane->type = type;
-@@ -4157,6 +4160,7 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
-                             enum wdrm_plane_type type)
- {
-       struct drm_plane *plane;
-+      struct drm_plane *plane2 = NULL; /* secondary plane */
-       if (!b->universal_planes) {
-               uint32_t format;
-@@ -4204,11 +4208,22 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
-               if (found_elsewhere)
-                       continue;
-+              /* The output should keep the primary plane connected to its
-+               * crtc since the direct switching of active plane is not
-+               * allowed. */
-+              if ((type == WDRM_PLANE_TYPE_PRIMARY) &&
-+                  (plane->crtc_id != output->crtc_id)) {
-+                      if (plane->crtc_id == 0) {
-+                              plane->possible_crtcs = (1 << output->pipe);
-+                              plane2 = plane;
-+                      }
-+                      continue;
-+              }
-               plane->possible_crtcs = (1 << output->pipe);
-               return plane;
-       }
--      return NULL;
-+      return plane2;
- }
- /**
--- 
-1.9.1
-
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend
deleted file mode 100644 (file)
index 09f1cdc..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-PACKAGECONFIG[kms] = "-Dbackend-drm=true,-Dbackend-drm=false,drm udev virtual/libgbm mtdev"
-
-PR:append = ".arago2"
-
-FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
-
-#        file://0005-weston-drm-fix-dual-display-issue.patch
-SRC_URI += " \
-         file://0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch \
-         file://0004-weston-Fix-touch-screen-crash-issue.patch \
-"
-
-INHIBIT_PACKAGE_STRIP = "1"
index 6152217..6ef08c4 100644 (file)
@@ -1,5 +1,5 @@
 BBLAYERS =+ "\
     ${METADIR}/bsp/meta-arm/meta-arm \
     ${METADIR}/bsp/meta-arm/meta-arm-toolchain \
-    ${METADIR}/bsp/meta-ti \
+    ${METADIR}/bsp/meta-ti/meta-ti-bsp \
     "