* [PATCH v3 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne
@ 2024-11-06 19:37 Ilkka Koskinen
2024-11-06 19:37 ` [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen
2024-11-06 19:37 ` [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
0 siblings, 2 replies; 7+ messages in thread
From: Ilkka Koskinen @ 2024-11-06 19:37 UTC (permalink / raw)
To: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward
Cc: Ilkka Koskinen, linux-arm-kernel, linux-perf-users, linux-kernel
v1:
* https://lore.kernel.org/all/20241024233035.7979-1-ilkka@os.amperecomputing.com/
v2:
* Doesn't use read_cpuid_implementor() anymore as that was broken and
unnecessary.
* Convert AmpereOne source field to matching common source fields to
avoid duplicating the code.
* Rebased on top of perf-tools-next/perf-tools-next (ba993e5ada1d)
* https://lore.kernel.org/all/20241031213533.11148-1-ilkka@os.amperecomputing.com/
v3:
* Changed source mapping to simple switch statement
* Dropped is_xyz() stuff
* Added table to map midr to data source decoding function
Ilkka Koskinen (2):
perf arm-spe: Prepare for adding data source packet implementations
for other cores
perf arm-spe: Add support for SPE Data Source packet on AmpereOne
.../util/arm-spe-decoder/arm-spe-decoder.h | 9 ++
tools/perf/util/arm-spe.c | 104 +++++++++++++-----
2 files changed, 88 insertions(+), 25 deletions(-)
--
2.47.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores 2024-11-06 19:37 [PATCH v3 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen @ 2024-11-06 19:37 ` Ilkka Koskinen 2024-11-07 15:25 ` Leo Yan 2024-11-06 19:37 ` [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen 1 sibling, 1 reply; 7+ messages in thread From: Ilkka Koskinen @ 2024-11-06 19:37 UTC (permalink / raw) To: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward Cc: Ilkka Koskinen, linux-arm-kernel, linux-perf-users, linux-kernel Split Data Source Packet handling to prepare adding support for other implementations. Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> --- tools/perf/util/arm-spe.c | 65 ++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c index dbf13f47879c..b222557cc27a 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c @@ -103,6 +103,18 @@ struct arm_spe_queue { u32 flags; }; +struct data_src { + struct midr_range midr_range; + void (*ds_synth)(const struct arm_spe_record *record, + union perf_mem_data_src *data_src); +}; + +#define DS(range, func) \ + { \ + .midr_range = range, \ + .ds_synth = arm_spe__synth_##func, \ + } + static void arm_spe_dump(struct arm_spe *spe __maybe_unused, unsigned char *buf, size_t len) { @@ -430,19 +442,6 @@ static int arm_spe__synth_instruction_sample(struct arm_spe_queue *speq, return arm_spe_deliver_synth_event(spe, speq, event, &sample); } -static const struct midr_range common_ds_encoding_cpus[] = { - MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), - MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), - MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), - MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), - MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), - {}, -}; - static void arm_spe__sample_flags(struct arm_spe_queue *speq) { const struct arm_spe_record *record = &speq->decoder->record; @@ -532,6 +531,19 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor } } +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), + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), data_source_common), + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), data_source_common), + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), data_source_common), + DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), data_source_common), + 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), + {}, +}; + static void arm_spe__synth_memory_level(const struct arm_spe_record *record, union perf_mem_data_src *data_src) { @@ -555,12 +567,14 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record, data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1; } -static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) +static bool arm_spe__synth_ds(struct arm_spe_queue *speq, + const struct arm_spe_record *record, + union perf_mem_data_src *data_src) { struct arm_spe *spe = speq->spe; - bool is_in_cpu_list; + const struct data_src *src = data_sources; u64 *metadata = NULL; - u64 midr = 0; + u64 midr; /* Metadata version 1 assumes all CPUs are the same (old behavior) */ if (spe->metadata_ver == 1) { @@ -592,18 +606,21 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) midr = metadata[ARM_SPE_CPU_MIDR]; } - is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus); - if (is_in_cpu_list) - return true; - else - return false; + while (src->midr_range.model) { + if (is_midr_in_range(midr, &src->midr_range)) { + src->ds_synth(record, data_src); + return true; + } + src++; + } + + return false; } static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, const struct arm_spe_record *record) { union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA }; - bool is_common = arm_spe__is_common_ds_encoding(speq); if (record->op & ARM_SPE_OP_LD) data_src.mem_op = PERF_MEM_OP_LOAD; @@ -612,9 +629,7 @@ static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, else return 0; - if (is_common) - arm_spe__synth_data_source_common(record, &data_src); - else + if (!arm_spe__synth_ds(speq, record, &data_src)) arm_spe__synth_memory_level(record, &data_src); if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) { -- 2.47.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores 2024-11-06 19:37 ` [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen @ 2024-11-07 15:25 ` Leo Yan 2024-11-07 23:55 ` Ilkka Koskinen 0 siblings, 1 reply; 7+ messages in thread From: Leo Yan @ 2024-11-07 15:25 UTC (permalink / raw) To: Ilkka Koskinen Cc: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward, linux-arm-kernel, linux-perf-users, linux-kernel Hi Ilkka, This is a good refactoring for me. Just several minor comments. On Wed, Nov 06, 2024 at 07:37:39PM +0000, Ilkka Koskinen wrote: > > Split Data Source Packet handling to prepare adding support for > other implementations. > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > --- > tools/perf/util/arm-spe.c | 65 ++++++++++++++++++++++++--------------- > 1 file changed, 40 insertions(+), 25 deletions(-) > > diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c > index dbf13f47879c..b222557cc27a 100644 > --- a/tools/perf/util/arm-spe.c > +++ b/tools/perf/util/arm-spe.c > @@ -103,6 +103,18 @@ struct arm_spe_queue { > u32 flags; > }; > > +struct data_src { > + struct midr_range midr_range; > + void (*ds_synth)(const struct arm_spe_record *record, > + union perf_mem_data_src *data_src); > +}; The naming is a bit mess. The data structure and the parameter both are called "data_src", though this will not cause building issue. How about rename the structure "data_src" to "data_source_handle" or "data_source_class"? For the "midr_range" field, I'd like to change it to a pointer: struct midr_range *midr_range; Please see below comments, which will present the reason for defining it as a pointer. > + > +#define DS(range, func) \ > + { \ > + .midr_range = range, \ > + .ds_synth = arm_spe__synth_##func, \ > + } > + > static void arm_spe_dump(struct arm_spe *spe __maybe_unused, > unsigned char *buf, size_t len) > { > @@ -430,19 +442,6 @@ static int arm_spe__synth_instruction_sample(struct arm_spe_queue *speq, > return arm_spe_deliver_synth_event(spe, speq, event, &sample); > } > > -static const struct midr_range common_ds_encoding_cpus[] = { > - MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), > - MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), > - MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), > - MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), > - MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), > - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), > - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), > - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), > - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), > - {}, > -}; We can keep this data structure. For Ampere CPUs, you can add a new data structure: static const struct midr_range ampereone_ds_encoding_cpus[] = { MIDR_ALL_VERSIONS(MIDR_AMPERE1A), {}, }; > - > static void arm_spe__sample_flags(struct arm_spe_queue *speq) > { > const struct arm_spe_record *record = &speq->decoder->record; > @@ -532,6 +531,19 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor > } > } > > +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), > + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), data_source_common), > + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), data_source_common), > + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), data_source_common), > + DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), data_source_common), > + 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), > + {}, > +}; > + As a result, we can simplify the structure as: static const struct data_src data_sources[] = { DS(common_ds_encoding_cpus, data_source_common), DS(ampereone_ds_encoding_cpus, data_source_ampereone), }; > static void arm_spe__synth_memory_level(const struct arm_spe_record *record, > union perf_mem_data_src *data_src) > { > @@ -555,12 +567,14 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record, > data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1; > } > > -static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) > +static bool arm_spe__synth_ds(struct arm_spe_queue *speq, > + const struct arm_spe_record *record, > + union perf_mem_data_src *data_src) > { > struct arm_spe *spe = speq->spe; > - bool is_in_cpu_list; > + const struct data_src *src = data_sources; > u64 *metadata = NULL; > - u64 midr = 0; > + u64 midr; > > /* Metadata version 1 assumes all CPUs are the same (old behavior) */ > if (spe->metadata_ver == 1) { > @@ -592,18 +606,21 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) > midr = metadata[ARM_SPE_CPU_MIDR]; > } > > - is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus); > - if (is_in_cpu_list) > - return true; > - else > - return false; > + while (src->midr_range.model) { > + if (is_midr_in_range(midr, &src->midr_range)) { > + src->ds_synth(record, data_src); > + return true; > + } > + src++; > + } Here we can traverse the 'data_sources' array: for (i = 0; i < ARRAY_SIZE(data_sources); i++) { if (is_midr_in_range(midr, data_sources[i]->midr_range)) { ... } } Thanks, Leo > + > + return false; > } > > static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, > const struct arm_spe_record *record) > { > union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA }; > - bool is_common = arm_spe__is_common_ds_encoding(speq); > > if (record->op & ARM_SPE_OP_LD) > data_src.mem_op = PERF_MEM_OP_LOAD; > @@ -612,9 +629,7 @@ static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, > else > return 0; > > - if (is_common) > - arm_spe__synth_data_source_common(record, &data_src); > - else > + if (!arm_spe__synth_ds(speq, record, &data_src)) > arm_spe__synth_memory_level(record, &data_src); > > if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) { > -- > 2.47.0 > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores 2024-11-07 15:25 ` Leo Yan @ 2024-11-07 23:55 ` Ilkka Koskinen 0 siblings, 0 replies; 7+ messages in thread From: Ilkka Koskinen @ 2024-11-07 23:55 UTC (permalink / raw) To: Leo Yan Cc: Ilkka Koskinen, John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward, linux-arm-kernel, linux-perf-users, linux-kernel Hi Leo, On Thu, 7 Nov 2024, Leo Yan wrote: > Hi Ilkka, > > This is a good refactoring for me. Just several minor comments. > > On Wed, Nov 06, 2024 at 07:37:39PM +0000, Ilkka Koskinen wrote: >> >> Split Data Source Packet handling to prepare adding support for >> other implementations. >> >> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> >> --- >> tools/perf/util/arm-spe.c | 65 ++++++++++++++++++++++++--------------- >> 1 file changed, 40 insertions(+), 25 deletions(-) >> >> diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c >> index dbf13f47879c..b222557cc27a 100644 >> --- a/tools/perf/util/arm-spe.c >> +++ b/tools/perf/util/arm-spe.c >> @@ -103,6 +103,18 @@ struct arm_spe_queue { >> u32 flags; >> }; >> >> +struct data_src { >> + struct midr_range midr_range; >> + void (*ds_synth)(const struct arm_spe_record *record, >> + union perf_mem_data_src *data_src); >> +}; > > The naming is a bit mess. The data structure and the parameter both > are called "data_src", though this will not cause building issue. > > How about rename the structure "data_src" to "data_source_handle" or > "data_source_class"? Yeah, I forgot to revisit the naming part. I like "data"source_handle", that should clarify it quite a bit. > > For the "midr_range" field, I'd like to change it to a pointer: > > struct midr_range *midr_range; > > Please see below comments, which will present the reason for defining > it as a pointer. > >> + >> +#define DS(range, func) \ >> + { \ >> + .midr_range = range, \ >> + .ds_synth = arm_spe__synth_##func, \ >> + } >> + >> static void arm_spe_dump(struct arm_spe *spe __maybe_unused, >> unsigned char *buf, size_t len) >> { >> @@ -430,19 +442,6 @@ static int arm_spe__synth_instruction_sample(struct arm_spe_queue *speq, >> return arm_spe_deliver_synth_event(spe, speq, event, &sample); >> } >> >> -static const struct midr_range common_ds_encoding_cpus[] = { >> - MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), >> - MIDR_ALL_VERSIONS(MIDR_CORTEX_A725), >> - MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), >> - MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), >> - MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), >> - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), >> - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), >> - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), >> - MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), >> - {}, >> -}; > > We can keep this data structure. For Ampere CPUs, you can add a new > data structure: > > static const struct midr_range ampereone_ds_encoding_cpus[] = { > MIDR_ALL_VERSIONS(MIDR_AMPERE1A), > {}, > }; Sounds good to me. I change all those. Cheers, Ilkka > >> - >> static void arm_spe__sample_flags(struct arm_spe_queue *speq) >> { >> const struct arm_spe_record *record = &speq->decoder->record; >> @@ -532,6 +531,19 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor >> } >> } >> >> +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), >> + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C), data_source_common), >> + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), data_source_common), >> + DS(MIDR_ALL_VERSIONS(MIDR_CORTEX_X925), data_source_common), >> + DS(MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), data_source_common), >> + 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), >> + {}, >> +}; >> + > > As a result, we can simplify the structure as: > > static const struct data_src data_sources[] = { > DS(common_ds_encoding_cpus, data_source_common), > DS(ampereone_ds_encoding_cpus, data_source_ampereone), > }; > >> static void arm_spe__synth_memory_level(const struct arm_spe_record *record, >> union perf_mem_data_src *data_src) >> { >> @@ -555,12 +567,14 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record, >> data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1; >> } >> >> -static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) >> +static bool arm_spe__synth_ds(struct arm_spe_queue *speq, >> + const struct arm_spe_record *record, >> + union perf_mem_data_src *data_src) >> { >> struct arm_spe *spe = speq->spe; >> - bool is_in_cpu_list; >> + const struct data_src *src = data_sources; >> u64 *metadata = NULL; >> - u64 midr = 0; >> + u64 midr; >> >> /* Metadata version 1 assumes all CPUs are the same (old behavior) */ >> if (spe->metadata_ver == 1) { >> @@ -592,18 +606,21 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) >> midr = metadata[ARM_SPE_CPU_MIDR]; >> } >> >> - is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus); >> - if (is_in_cpu_list) >> - return true; >> - else >> - return false; >> + while (src->midr_range.model) { >> + if (is_midr_in_range(midr, &src->midr_range)) { >> + src->ds_synth(record, data_src); >> + return true; >> + } >> + src++; >> + } > > Here we can traverse the 'data_sources' array: > > for (i = 0; i < ARRAY_SIZE(data_sources); i++) { > if (is_midr_in_range(midr, data_sources[i]->midr_range)) { > ... > } > } > > Thanks, > Leo > >> + >> + return false; >> } >> >> static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, >> const struct arm_spe_record *record) >> { >> union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA }; >> - bool is_common = arm_spe__is_common_ds_encoding(speq); >> >> if (record->op & ARM_SPE_OP_LD) >> data_src.mem_op = PERF_MEM_OP_LOAD; >> @@ -612,9 +629,7 @@ static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, >> else >> return 0; >> >> - if (is_common) >> - arm_spe__synth_data_source_common(record, &data_src); >> - else >> + if (!arm_spe__synth_ds(speq, record, &data_src)) >> arm_spe__synth_memory_level(record, &data_src); >> >> if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) { >> -- >> 2.47.0 >> >> > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne 2024-11-06 19:37 [PATCH v3 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen 2024-11-06 19:37 ` [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen @ 2024-11-06 19:37 ` Ilkka Koskinen 2024-11-07 15:44 ` Leo Yan 1 sibling, 1 reply; 7+ messages in thread From: Ilkka Koskinen @ 2024-11-06 19:37 UTC (permalink / raw) To: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward Cc: Ilkka Koskinen, linux-arm-kernel, linux-perf-users, linux-kernel 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 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne 2024-11-06 19:37 ` [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen @ 2024-11-07 15:44 ` Leo Yan 2024-11-07 23:56 ` Ilkka Koskinen 0 siblings, 1 reply; 7+ messages in thread From: Leo Yan @ 2024-11-07 15:44 UTC (permalink / raw) To: Ilkka Koskinen Cc: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward, linux-arm-kernel, linux-perf-users, linux-kernel 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 > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne 2024-11-07 15:44 ` Leo Yan @ 2024-11-07 23:56 ` Ilkka Koskinen 0 siblings, 0 replies; 7+ messages in thread From: Ilkka Koskinen @ 2024-11-07 23:56 UTC (permalink / raw) To: Leo Yan Cc: Ilkka Koskinen, John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward, linux-arm-kernel, linux-perf-users, linux-kernel 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 >> >> > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-11-07 23:57 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-06 19:37 [PATCH v3 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen 2024-11-06 19:37 ` [PATCH v3 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen 2024-11-07 15:25 ` Leo Yan 2024-11-07 23:55 ` Ilkka Koskinen 2024-11-06 19:37 ` [PATCH v3 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen 2024-11-07 15:44 ` Leo Yan 2024-11-07 23:56 ` Ilkka Koskinen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).