Decode SPE Data Source packets on AmpereOne. The field is IMPDEF.
Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
---
.../util/arm-spe-decoder/arm-spe-decoder.h | 9 +++++
tools/perf/util/arm-spe.c | 39 +++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
index 358c611eeddb..4bcd627e859f 100644
--- a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
+++ b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
@@ -67,6 +67,15 @@ enum arm_spe_common_data_source {
ARM_SPE_COMMON_DS_DRAM = 0xe,
};
+enum arm_spe_ampereone_data_source {
+ ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE = 0x0,
+ ARM_SPE_AMPEREONE_SLC = 0x3,
+ ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE = 0x5,
+ ARM_SPE_AMPEREONE_DDR = 0x7,
+ ARM_SPE_AMPEREONE_L1D = 0x8,
+ ARM_SPE_AMPEREONE_L2D = 0x9,
+};
+
struct arm_spe_record {
enum arm_spe_sample_type type;
int err;
diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
index b222557cc27a..40847a3d18b0 100644
--- a/tools/perf/util/arm-spe.c
+++ b/tools/perf/util/arm-spe.c
@@ -531,6 +531,44 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor
}
}
+/*
+ * Source is IMPDEF. Here we convert the source code used on AmpereOne cores
+ * to the common (Neoverse, Cortex) to avoid duplicating the decoding code.
+ */
+static void arm_spe__synth_data_source_ampereone(const struct arm_spe_record *record,
+ union perf_mem_data_src *data_src)
+{
+ struct arm_spe_record common_record;
+
+ switch (record->source) {
+ case ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE:
+ common_record.source = ARM_SPE_COMMON_DS_PEER_CORE;
+ break;
+ case ARM_SPE_AMPEREONE_SLC:
+ common_record.source = ARM_SPE_COMMON_DS_SYS_CACHE;
+ break;
+ case ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE:
+ common_record.source = ARM_SPE_COMMON_DS_REMOTE;
+ break;
+ case ARM_SPE_AMPEREONE_DDR:
+ common_record.source = ARM_SPE_COMMON_DS_DRAM;
+ break;
+ case ARM_SPE_AMPEREONE_L1D:
+ common_record.source = ARM_SPE_COMMON_DS_L1D;
+ break;
+ case ARM_SPE_AMPEREONE_L2D:
+ common_record.source = ARM_SPE_COMMON_DS_L2;
+ break;
+ default:
+ /* Assign a bogus value that's not used for common coding */
+ common_record.source = 0xffff;
+ break;
+ }
+
+ common_record.op = record->op;
+ arm_spe__synth_data_source_common(&common_record, data_src);
+}
+
static const struct data_src data_sources[] = {
DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), data_source_common),
DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), data_source_common),
@@ -541,6 +579,7 @@ static const struct data_src data_sources[] = {
DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), data_source_common),
DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), data_source_common),
DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), data_source_common),
+ DS(MIDR_ALL_VERSIONS(MIDR_AMPERE1A), data_source_ampereone),
{},
};
--
2.47.0
On Wed, Nov 06, 2024 at 07:37:40PM +0000, Ilkka Koskinen wrote: > Warning: EXTERNAL SENDER, use caution when opening links or attachments. > > > Decode SPE Data Source packets on AmpereOne. The field is IMPDEF. > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > --- > .../util/arm-spe-decoder/arm-spe-decoder.h | 9 +++++ > tools/perf/util/arm-spe.c | 39 +++++++++++++++++++ > 2 files changed, 48 insertions(+) > > diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h > index 358c611eeddb..4bcd627e859f 100644 > --- a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h > +++ b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h > @@ -67,6 +67,15 @@ enum arm_spe_common_data_source { > ARM_SPE_COMMON_DS_DRAM = 0xe, > }; > > +enum arm_spe_ampereone_data_source { > + ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE = 0x0, > + ARM_SPE_AMPEREONE_SLC = 0x3, > + ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE = 0x5, > + ARM_SPE_AMPEREONE_DDR = 0x7, > + ARM_SPE_AMPEREONE_L1D = 0x8, > + ARM_SPE_AMPEREONE_L2D = 0x9, > +}; > + > struct arm_spe_record { > enum arm_spe_sample_type type; > int err; > diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c > index b222557cc27a..40847a3d18b0 100644 > --- a/tools/perf/util/arm-spe.c > +++ b/tools/perf/util/arm-spe.c > @@ -531,6 +531,44 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor > } > } > > +/* > + * Source is IMPDEF. Here we convert the source code used on AmpereOne cores > + * to the common (Neoverse, Cortex) to avoid duplicating the decoding code. > + */ > +static void arm_spe__synth_data_source_ampereone(const struct arm_spe_record *record, > + union perf_mem_data_src *data_src) > +{ > + struct arm_spe_record common_record; > + > + switch (record->source) { > + case ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE: > + common_record.source = ARM_SPE_COMMON_DS_PEER_CORE; > + break; > + case ARM_SPE_AMPEREONE_SLC: > + common_record.source = ARM_SPE_COMMON_DS_SYS_CACHE; > + break; > + case ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE: > + common_record.source = ARM_SPE_COMMON_DS_REMOTE; > + break; > + case ARM_SPE_AMPEREONE_DDR: > + common_record.source = ARM_SPE_COMMON_DS_DRAM; > + break; > + case ARM_SPE_AMPEREONE_L1D: > + common_record.source = ARM_SPE_COMMON_DS_L1D; > + break; > + case ARM_SPE_AMPEREONE_L2D: > + common_record.source = ARM_SPE_COMMON_DS_L2; > + break; > + default: > + /* Assign a bogus value that's not used for common coding */ > + common_record.source = 0xffff; For unsupported source value, just bail out and no need to calling arm_spe__synth_data_source_common(). It is good to use pr_warning_once() to print out warning log to remind users. Thanks, Leo > + break; > + } > + > + common_record.op = record->op; > + arm_spe__synth_data_source_common(&common_record, data_src); > +} > + > static const struct data_src data_sources[] = { > DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), data_source_common), > DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), data_source_common), > @@ -541,6 +579,7 @@ static const struct data_src data_sources[] = { > DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), data_source_common), > DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), data_source_common), > DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), data_source_common), > + DS(MIDR_ALL_VERSIONS(MIDR_AMPERE1A), data_source_ampereone), > {}, > }; > > -- > 2.47.0 > >
On Thu, 7 Nov 2024, Leo Yan wrote: > On Wed, Nov 06, 2024 at 07:37:40PM +0000, Ilkka Koskinen wrote: >> Warning: EXTERNAL SENDER, use caution when opening links or attachments. >> >> >> Decode SPE Data Source packets on AmpereOne. The field is IMPDEF. >> >> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> >> --- >> .../util/arm-spe-decoder/arm-spe-decoder.h | 9 +++++ >> tools/perf/util/arm-spe.c | 39 +++++++++++++++++++ >> 2 files changed, 48 insertions(+) >> >> diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h >> index 358c611eeddb..4bcd627e859f 100644 >> --- a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h >> +++ b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h >> @@ -67,6 +67,15 @@ enum arm_spe_common_data_source { >> ARM_SPE_COMMON_DS_DRAM = 0xe, >> }; >> >> +enum arm_spe_ampereone_data_source { >> + ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE = 0x0, >> + ARM_SPE_AMPEREONE_SLC = 0x3, >> + ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE = 0x5, >> + ARM_SPE_AMPEREONE_DDR = 0x7, >> + ARM_SPE_AMPEREONE_L1D = 0x8, >> + ARM_SPE_AMPEREONE_L2D = 0x9, >> +}; >> + >> struct arm_spe_record { >> enum arm_spe_sample_type type; >> int err; >> diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c >> index b222557cc27a..40847a3d18b0 100644 >> --- a/tools/perf/util/arm-spe.c >> +++ b/tools/perf/util/arm-spe.c >> @@ -531,6 +531,44 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor >> } >> } >> >> +/* >> + * Source is IMPDEF. Here we convert the source code used on AmpereOne cores >> + * to the common (Neoverse, Cortex) to avoid duplicating the decoding code. >> + */ >> +static void arm_spe__synth_data_source_ampereone(const struct arm_spe_record *record, >> + union perf_mem_data_src *data_src) >> +{ >> + struct arm_spe_record common_record; >> + >> + switch (record->source) { >> + case ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE: >> + common_record.source = ARM_SPE_COMMON_DS_PEER_CORE; >> + break; >> + case ARM_SPE_AMPEREONE_SLC: >> + common_record.source = ARM_SPE_COMMON_DS_SYS_CACHE; >> + break; >> + case ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE: >> + common_record.source = ARM_SPE_COMMON_DS_REMOTE; >> + break; >> + case ARM_SPE_AMPEREONE_DDR: >> + common_record.source = ARM_SPE_COMMON_DS_DRAM; >> + break; >> + case ARM_SPE_AMPEREONE_L1D: >> + common_record.source = ARM_SPE_COMMON_DS_L1D; >> + break; >> + case ARM_SPE_AMPEREONE_L2D: >> + common_record.source = ARM_SPE_COMMON_DS_L2; >> + break; >> + default: >> + /* Assign a bogus value that's not used for common coding */ >> + common_record.source = 0xffff; > > For unsupported source value, just bail out and no need to calling > arm_spe__synth_data_source_common(). > > It is good to use pr_warning_once() to print out warning log to remind > users. Hi Leo, Makes sense, I'll do that. --Ilkka > > Thanks, > Leo > >> + break; >> + } >> + >> + common_record.op = record->op; >> + arm_spe__synth_data_source_common(&common_record, data_src); >> +} >> + >> static const struct data_src data_sources[] = { >> DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), data_source_common), >> DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), data_source_common), >> @@ -541,6 +579,7 @@ static const struct data_src data_sources[] = { >> DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), data_source_common), >> DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), data_source_common), >> DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), data_source_common), >> + DS(MIDR_ALL_VERSIONS(MIDR_AMPERE1A), data_source_ampereone), >> {}, >> }; >> >> -- >> 2.47.0 >> >> >
© 2016 - 2024 Red Hat, Inc.