Message ID | 20241106193740.6159-3-ilkka@os.amperecomputing.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | perf arm-spe: Add support for SPE Data Source packet on AmpereOne | expand |
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 >> >> >
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), {}, };
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(+)