struct json_event {
        char *name;
+       char *compat;
        char *event;
        char *desc;
        char *long_desc;
 
 typedef int (*func)(void *data, struct json_event *je);
 
+static LIST_HEAD(sys_event_tables);
+
+struct sys_event_table {
+       struct list_head list;
+       char *soc_id;
+};
+
+static void free_sys_event_tables(void)
+{
+       struct sys_event_table *et, *next;
+
+       list_for_each_entry_safe(et, next, &sys_event_tables, list) {
+               free(et->soc_id);
+               free(et);
+       }
+}
+
 int eprintf(int level, int var, const char *fmt, ...)
 {
 
        if (je->event)
                fprintf(outfp, "\t.event = \"%s\",\n", je->event);
        fprintf(outfp, "\t.desc = \"%s\",\n", je->desc);
+       if (je->compat)
+               fprintf(outfp, "\t.compat = \"%s\",\n", je->compat);
        fprintf(outfp, "\t.topic = \"%s\",\n", topic);
        if (je->long_desc && je->long_desc[0])
                fprintf(outfp, "\t.long_desc = \"%s\",\n", je->long_desc);
        struct list_head list;
        char *name;
        char *event;
+       char *compat;
        char *desc;
        char *long_desc;
        char *pmu;
                                free(code);
                        } else if (json_streq(map, field, "EventName")) {
                                addfield(map, &je.name, "", "", val);
+                       } else if (json_streq(map, field, "Compat")) {
+                               addfield(map, &je.compat, "", "", val);
                        } else if (json_streq(map, field, "BriefDescription")) {
                                addfield(map, &je.desc, "", "", val);
                                fixdesc(je.desc);
                free(event);
                free(je.desc);
                free(je.name);
+               free(je.compat);
                free(je.long_desc);
                free(extra_desc);
                free(je.pmu);
        return tblname;
 }
 
+static bool is_sys_dir(char *fname)
+{
+       size_t len = strlen(fname), len2 = strlen("/sys");
+
+       if (len2 > len)
+               return false;
+       return !strcmp(fname+len-len2, "/sys");
+}
+
 static void print_mapping_table_prefix(FILE *outfp)
 {
        fprintf(outfp, "struct pmu_events_map pmu_events_map[] = {\n");
        fprintf(outfp, "},\n");
 }
 
+static void print_system_event_mapping_table_prefix(FILE *outfp)
+{
+       fprintf(outfp, "\nstruct pmu_sys_events pmu_sys_event_tables[] = {");
+}
+
+static void print_system_event_mapping_table_suffix(FILE *outfp)
+{
+       fprintf(outfp, "\n\t{\n\t\t.table = 0\n\t},");
+       fprintf(outfp, "\n};\n");
+}
+
+static int process_system_event_tables(FILE *outfp)
+{
+       struct sys_event_table *sys_event_table;
+
+       print_system_event_mapping_table_prefix(outfp);
+
+       list_for_each_entry(sys_event_table, &sys_event_tables, list) {
+               fprintf(outfp, "\n\t{\n\t\t.table = %s,\n\t},",
+                       sys_event_table->soc_id);
+       }
+
+       print_system_event_mapping_table_suffix(outfp);
+
+       return 0;
+}
+
 static int process_mapfile(FILE *outfp, char *fpath)
 {
        int n = 16384;
        fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n");
        print_mapping_table_prefix(outfp);
        print_mapping_table_suffix(outfp);
+       print_system_event_mapping_table_prefix(outfp);
+       print_system_event_mapping_table_suffix(outfp);
        fclose(outfp);
 }
 
                        return -1;
                }
 
+               if (is_sys_dir(bname)) {
+                       struct sys_event_table *sys_event_table;
+
+                       sys_event_table = malloc(sizeof(*sys_event_table));
+                       if (!sys_event_table)
+                               return -1;
+
+                       sys_event_table->soc_id = strdup(tblname);
+                       if (!sys_event_table->soc_id) {
+                               free(sys_event_table);
+                               return -1;
+                       }
+                       list_add_tail(&sys_event_table->list,
+                                     &sys_event_tables);
+               }
+
                print_events_table_prefix(eventsfp, tblname);
                return 0;
        }
        }
 
        rc = process_mapfile(eventsfp, mapfile);
-       fclose(eventsfp);
        if (rc) {
                pr_info("%s: Error processing mapfile %s\n", prog, mapfile);
                /* Make build fail */
+               ret = 1;
+               goto err_close_eventsfp;
+       }
+
+       rc = process_system_event_tables(eventsfp);
+       fclose(eventsfp);
+       if (rc) {
                ret = 1;
                goto err_out;
        }