commit ba5c1f92561354fb23d53dde75b138d5f2ec20f9 Author: zhaoxc0502 Date: Thu Jun 16 17:15:24 2022 +0800 linux_tools Change-Id: Iae021412b0487eb94f4a92f5d54464fb539e5ef8 diff --git a/Makefile b/Makefile index dce02fbb7..0261b51b2 100644 --- a/Makefile +++ b/Makefile @@ -496,7 +496,6 @@ LINUXINCLUDE := \ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \ - -Werror=implicit-function-declaration -Werror=implicit-int \ -Werror=return-type -Wno-format-security \ -std=gnu89 KBUILD_CPPFLAGS := -D__KERNEL__ @@ -945,7 +944,7 @@ KBUILD_CFLAGS += $(call cc-option,-fconserve-stack) KBUILD_CFLAGS += -Werror=date-time # enforce correct pointer usage -KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types) +# KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types) # Require designated initializers for all marked structures KBUILD_CFLAGS += $(call cc-option,-Werror=designated-init) diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c index d730666ab..ac887af0d 100644 --- a/tools/perf/arch/arm64/util/header.c +++ b/tools/perf/arch/arm64/util/header.c @@ -99,3 +99,31 @@ char *get_cpuid_str(struct perf_pmu *pmu) return buf; } + +#define LEN 20 + +int soc_version_check(const char *soc_name __maybe_unused) +{ + FILE *soc_fd; + char name[LEN]; + + soc_fd = fopen("/sys/devices/soc0/soc_id", "r"); + if (!soc_fd) { + pr_debug("fopen failed for file /sys/devices/soc0/soc_id\n"); + return false; + } + + if (!fgets(name, LEN, soc_fd)) { + pr_debug("get soc name failed\n"); + fclose(soc_fd); + return false; + } + fclose(soc_fd); + + name[strlen(name) - 1] = '\0'; + + if (!strcmp(name, soc_name)) + return false; + + return true; +} diff --git a/tools/perf/pmu-events/arch/arm64/arm/cortex-a53/uncore-imx8mm-ddr.json b/tools/perf/pmu-events/arch/arm64/arm/cortex-a53/uncore-imx8mm-ddr.json new file mode 100644 index 000000000..eea2ce5c7 --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/arm/cortex-a53/uncore-imx8mm-ddr.json @@ -0,0 +1,34 @@ +[ + { + "BriefDescription": "bandwidth usage for lpddr4 evk board", + "MetricName": "imx8mm_bandwidth_usage.lpddr4", + "MetricExpr": "(( imx8_ddr0@read\\-cycles@ + imx8_ddr0@write\\-cycles@ ) * 4 * 4 / duration_time) / (750 * 1000000 * 4 * 4)", + "ScaleUnit": "1e2%", + "SocName": "i.MX8MM", + "Unit": "imx8_ddr" + }, + { + "BriefDescription": "bandwidth usage for ddr4 evk board", + "MetricName": "imx8mm_bandwidth_usage.ddr4", + "MetricExpr": "(( imx8_ddr0@read\\-cycles@ + imx8_ddr0@write\\-cycles@ ) * 4 * 4 / duration_time) / (600 * 1000000 * 4 * 4)", + "ScaleUnit": "1e2%", + "SocName": "i.MX8MM", + "Unit": "imx8_ddr" + }, + { + "BriefDescription": "bytes all masters read from ddr based on read-cycles event", + "MetricName": "imx8mm_ddr_read.all", + "MetricExpr": "imx8_ddr0@read\\-cycles@ * 4 * 4", + "ScaleUnit": "9.765625e-4KB", + "SocName": "i.MX8MM", + "Unit": "imx8_ddr" + }, + { + "BriefDescription": "bytes all masters wirte to ddr based on write-cycles event", + "MetricName": "imx8mm_ddr_write.all", + "MetricExpr": "imx8_ddr0@write\\-cycles@ * 4 * 4", + "ScaleUnit": "9.765625e-4KB", + "SocName": "i.MX8MM", + "Unit": "imx8_ddr" + } +] diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index c679a79ae..f18b08fc3 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c @@ -61,6 +61,7 @@ struct json_event { char *pmu; char *unit; char *perpkg; + char *socname; char *aggr_mode; char *metric_expr; char *metric_name; @@ -258,6 +259,7 @@ static struct map { { "SBO", "uncore_sbox" }, { "iMPH-U", "uncore_arb" }, { "CPU-M-CF", "cpum_cf" }, + { "imx8_ddr", "imx8_ddr"}, { "CPU-M-SF", "cpum_sf" }, { "UPI LL", "uncore_upi" }, { "hisi_sccl,ddrc", "hisi_sccl,ddrc" }, @@ -369,6 +371,8 @@ static int print_events_table_entry(void *data, struct json_event *je) fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); if (je->perpkg) fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); + if (je->socname) + fprintf(outfp, "\t.socname = \"%s\",\n", je->socname); if (je->aggr_mode) fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode)); if (je->metric_expr) @@ -395,6 +399,7 @@ struct event_struct { char *pmu; char *unit; char *perpkg; + char *socname; char *aggr_mode; char *metric_expr; char *metric_name; @@ -425,6 +430,7 @@ struct event_struct { op(pmu); \ op(unit); \ op(perpkg); \ + op(socname); \ op(aggr_mode); \ op(metric_expr); \ op(metric_name); \ @@ -626,6 +632,8 @@ static int json_events(const char *fn, addfield(map, &je.unit, "", "", val); } else if (json_streq(map, field, "PerPkg")) { addfield(map, &je.perpkg, "", "", val); + } else if (json_streq(map, field, "SocName")) { + addfield(map, &je.socname, "", "", val); } else if (json_streq(map, field, "AggregationMode")) { addfield(map, &je.aggr_mode, "", "", val); } else if (json_streq(map, field, "Deprecated")) { @@ -688,6 +696,7 @@ static int json_events(const char *fn, free(je.pmu); free(filter); free(je.perpkg); + free(je.socname); free(je.aggr_mode); free(je.deprecated); free(je.unit); diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h index 7da1a3743..89931de5f 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h @@ -19,6 +19,7 @@ struct pmu_event { const char *pmu; const char *unit; const char *perpkg; + const char *socname; const char *aggr_mode; const char *metric_expr; const char *metric_name; diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index be850e9f8..141131a03 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -844,6 +844,15 @@ int __weak strcmp_cpuid_str(const char *mapcpuid, const char *cpuid) return 1; } +/* + * default soc_version_check(): nothing gets recorded + * actual implementation must be in arch/$(SRCARCH)/util/header.c + */ +int __weak soc_version_check(const char *soc_name __maybe_unused) +{ + return -1; +} + /* * default get_cpuid(): nothing gets recorded * actual implementation must be in arch/$(SRCARCH)/util/header.c diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 2aca71763..5691073fe 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -163,4 +163,6 @@ int get_cpuid(char *buffer, size_t sz); char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused); int strcmp_cpuid_str(const char *s1, const char *s2); + +int soc_version_check(const char *soc_name __maybe_unused); #endif /* __PERF_HEADER_H */ diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 060454a17..1f12fe301 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -13,6 +13,7 @@ #include "pmu.h" #include "expr.h" #include "rblist.h" +#include "header.h" #include #include #include "strlist.h" @@ -518,6 +519,8 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter, const char *g; pe = &map->table[i]; + if (pe->socname && soc_version_check(pe->socname)) + continue; if (!pe->name && !pe->metric_group && !pe->metric_name) break; if (!pe->metric_expr) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index d41caeb35..289c7af53 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -664,6 +664,15 @@ static char *perf_pmu__getcpuid(struct perf_pmu *pmu) cpuid = strdup(cpuid); if (!cpuid) cpuid = get_cpuid_str(pmu); + if (!cpuid && !pmu) { + cpuid = malloc(1024); + if (!cpuid) + return NULL; + if (get_cpuid(cpuid, 1024)) { + free(cpuid); + return NULL; + } + } if (!cpuid) return NULL; diff --git a/tools/virtio/asm/barrier.h b/tools/virtio/asm/barrier.h index 04d563fc9..468435ed6 100644 --- a/tools/virtio/asm/barrier.h +++ b/tools/virtio/asm/barrier.h @@ -16,6 +16,16 @@ # define mb() abort() # define dma_rmb() abort() # define dma_wmb() abort() +#elif defined(__aarch64__) +#define dmb(opt) asm volatile("dmb " #opt : : : "memory") +#define virt_mb() __sync_synchronize() +#define virt_rmb() dmb(ishld) +#define virt_wmb() dmb(ishst) +#define virt_store_mb(var, value) do { WRITE_ONCE(var, value); dmb(ish); } while (0) +/* Weak barriers should be used. If not - it's a bug */ +# define mb() abort() +# define dma_rmb() abort() +# define dma_wmb() abort() #else #error Please fill in barrier macros #endif