Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/perf: hisi: Provide a generic implementation of cpumask/identifier

Each type of HiSilicon Uncore PMU has the following sysfs attributes:

- format: bitmask in perf_event_attr::config[012] of corresponding
attribute
- event: events name and corresponding event code
- cpumask: range of CPUs the events can be opened on
- identifier: the version of this PMU

Different types of PMU have different implementations of the "format"
and "event" but all share the same implementation of the "cpumask"
and "identifier". Thus we can move cpumask and identifier to the
hisi_uncore_pmu framework and drivers can use the generic
implementation.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Link: https://lore.kernel.org/r/20241210141525.37788-8-yangyicong@huawei.com
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Yicong Yang and committed by
Will Deacon
8688c01e 32528b16

+63 -195
+2 -25
drivers/perf/hisilicon/hisi_uncore_cpa_pmu.c
··· 225 225 .attrs = hisi_cpa_pmu_events_attr, 226 226 }; 227 227 228 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 229 - 230 - static struct attribute *hisi_cpa_pmu_cpumask_attrs[] = { 231 - &dev_attr_cpumask.attr, 232 - NULL 233 - }; 234 - 235 - static const struct attribute_group hisi_cpa_pmu_cpumask_attr_group = { 236 - .attrs = hisi_cpa_pmu_cpumask_attrs, 237 - }; 238 - 239 - static struct device_attribute hisi_cpa_pmu_identifier_attr = 240 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 241 - 242 - static struct attribute *hisi_cpa_pmu_identifier_attrs[] = { 243 - &hisi_cpa_pmu_identifier_attr.attr, 244 - NULL 245 - }; 246 - 247 - static const struct attribute_group hisi_cpa_pmu_identifier_group = { 248 - .attrs = hisi_cpa_pmu_identifier_attrs, 249 - }; 250 - 251 228 static const struct attribute_group *hisi_cpa_pmu_attr_groups[] = { 252 229 &hisi_cpa_pmu_format_group, 253 230 &hisi_cpa_pmu_events_group, 254 - &hisi_cpa_pmu_cpumask_attr_group, 255 - &hisi_cpa_pmu_identifier_group, 231 + &hisi_pmu_cpumask_attr_group, 232 + &hisi_pmu_identifier_group, 256 233 NULL 257 234 }; 258 235
+4 -27
drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
··· 380 380 .attrs = hisi_ddrc_pmu_v2_events_attr, 381 381 }; 382 382 383 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 384 - 385 - static struct attribute *hisi_ddrc_pmu_cpumask_attrs[] = { 386 - &dev_attr_cpumask.attr, 387 - NULL, 388 - }; 389 - 390 - static const struct attribute_group hisi_ddrc_pmu_cpumask_attr_group = { 391 - .attrs = hisi_ddrc_pmu_cpumask_attrs, 392 - }; 393 - 394 - static struct device_attribute hisi_ddrc_pmu_identifier_attr = 395 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 396 - 397 - static struct attribute *hisi_ddrc_pmu_identifier_attrs[] = { 398 - &hisi_ddrc_pmu_identifier_attr.attr, 399 - NULL 400 - }; 401 - 402 - static const struct attribute_group hisi_ddrc_pmu_identifier_group = { 403 - .attrs = hisi_ddrc_pmu_identifier_attrs, 404 - }; 405 - 406 383 static const struct attribute_group *hisi_ddrc_pmu_v1_attr_groups[] = { 407 384 &hisi_ddrc_pmu_v1_format_group, 408 385 &hisi_ddrc_pmu_v1_events_group, 409 - &hisi_ddrc_pmu_cpumask_attr_group, 410 - &hisi_ddrc_pmu_identifier_group, 386 + &hisi_pmu_cpumask_attr_group, 387 + &hisi_pmu_identifier_group, 411 388 NULL, 412 389 }; 413 390 414 391 static const struct attribute_group *hisi_ddrc_pmu_v2_attr_groups[] = { 415 392 &hisi_ddrc_pmu_v2_format_group, 416 393 &hisi_ddrc_pmu_v2_events_group, 417 - &hisi_ddrc_pmu_cpumask_attr_group, 418 - &hisi_ddrc_pmu_identifier_group, 394 + &hisi_pmu_cpumask_attr_group, 395 + &hisi_pmu_identifier_group, 419 396 NULL 420 397 }; 421 398
+4 -27
drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
··· 405 405 .attrs = hisi_hha_pmu_v2_events_attr, 406 406 }; 407 407 408 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 409 - 410 - static struct attribute *hisi_hha_pmu_cpumask_attrs[] = { 411 - &dev_attr_cpumask.attr, 412 - NULL, 413 - }; 414 - 415 - static const struct attribute_group hisi_hha_pmu_cpumask_attr_group = { 416 - .attrs = hisi_hha_pmu_cpumask_attrs, 417 - }; 418 - 419 - static struct device_attribute hisi_hha_pmu_identifier_attr = 420 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 421 - 422 - static struct attribute *hisi_hha_pmu_identifier_attrs[] = { 423 - &hisi_hha_pmu_identifier_attr.attr, 424 - NULL 425 - }; 426 - 427 - static const struct attribute_group hisi_hha_pmu_identifier_group = { 428 - .attrs = hisi_hha_pmu_identifier_attrs, 429 - }; 430 - 431 408 static const struct attribute_group *hisi_hha_pmu_v1_attr_groups[] = { 432 409 &hisi_hha_pmu_v1_format_group, 433 410 &hisi_hha_pmu_v1_events_group, 434 - &hisi_hha_pmu_cpumask_attr_group, 435 - &hisi_hha_pmu_identifier_group, 411 + &hisi_pmu_cpumask_attr_group, 412 + &hisi_pmu_identifier_group, 436 413 NULL, 437 414 }; 438 415 439 416 static const struct attribute_group *hisi_hha_pmu_v2_attr_groups[] = { 440 417 &hisi_hha_pmu_v2_format_group, 441 418 &hisi_hha_pmu_v2_events_group, 442 - &hisi_hha_pmu_cpumask_attr_group, 443 - &hisi_hha_pmu_identifier_group, 419 + &hisi_pmu_cpumask_attr_group, 420 + &hisi_pmu_identifier_group, 444 421 NULL 445 422 }; 446 423
+4 -27
drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
··· 441 441 .attrs = hisi_l3c_pmu_v2_events_attr, 442 442 }; 443 443 444 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 445 - 446 - static struct attribute *hisi_l3c_pmu_cpumask_attrs[] = { 447 - &dev_attr_cpumask.attr, 448 - NULL, 449 - }; 450 - 451 - static const struct attribute_group hisi_l3c_pmu_cpumask_attr_group = { 452 - .attrs = hisi_l3c_pmu_cpumask_attrs, 453 - }; 454 - 455 - static struct device_attribute hisi_l3c_pmu_identifier_attr = 456 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 457 - 458 - static struct attribute *hisi_l3c_pmu_identifier_attrs[] = { 459 - &hisi_l3c_pmu_identifier_attr.attr, 460 - NULL 461 - }; 462 - 463 - static const struct attribute_group hisi_l3c_pmu_identifier_group = { 464 - .attrs = hisi_l3c_pmu_identifier_attrs, 465 - }; 466 - 467 444 static const struct attribute_group *hisi_l3c_pmu_v1_attr_groups[] = { 468 445 &hisi_l3c_pmu_v1_format_group, 469 446 &hisi_l3c_pmu_v1_events_group, 470 - &hisi_l3c_pmu_cpumask_attr_group, 471 - &hisi_l3c_pmu_identifier_group, 447 + &hisi_pmu_cpumask_attr_group, 448 + &hisi_pmu_identifier_group, 472 449 NULL, 473 450 }; 474 451 475 452 static const struct attribute_group *hisi_l3c_pmu_v2_attr_groups[] = { 476 453 &hisi_l3c_pmu_v2_format_group, 477 454 &hisi_l3c_pmu_v2_events_group, 478 - &hisi_l3c_pmu_cpumask_attr_group, 479 - &hisi_l3c_pmu_identifier_group, 455 + &hisi_pmu_cpumask_attr_group, 456 + &hisi_pmu_identifier_group, 480 457 NULL 481 458 }; 482 459
+6 -29
drivers/perf/hisilicon/hisi_uncore_pa_pmu.c
··· 353 353 .attrs = hisi_h60pa_pmu_events_attr, 354 354 }; 355 355 356 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 357 - 358 - static struct attribute *hisi_pa_pmu_cpumask_attrs[] = { 359 - &dev_attr_cpumask.attr, 360 - NULL 361 - }; 362 - 363 - static const struct attribute_group hisi_pa_pmu_cpumask_attr_group = { 364 - .attrs = hisi_pa_pmu_cpumask_attrs, 365 - }; 366 - 367 - static struct device_attribute hisi_pa_pmu_identifier_attr = 368 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 369 - 370 - static struct attribute *hisi_pa_pmu_identifier_attrs[] = { 371 - &hisi_pa_pmu_identifier_attr.attr, 372 - NULL 373 - }; 374 - 375 - static const struct attribute_group hisi_pa_pmu_identifier_group = { 376 - .attrs = hisi_pa_pmu_identifier_attrs, 377 - }; 378 - 379 356 static struct hisi_pa_pmu_int_regs hisi_pa_pmu_regs = { 380 357 .mask_offset = PA_INT_MASK, 381 358 .clear_offset = PA_INT_CLEAR, ··· 362 385 static const struct attribute_group *hisi_pa_pmu_v2_attr_groups[] = { 363 386 &hisi_pa_pmu_v2_format_group, 364 387 &hisi_pa_pmu_v2_events_group, 365 - &hisi_pa_pmu_cpumask_attr_group, 366 - &hisi_pa_pmu_identifier_group, 388 + &hisi_pmu_cpumask_attr_group, 389 + &hisi_pmu_identifier_group, 367 390 NULL 368 391 }; 369 392 ··· 376 399 static const struct attribute_group *hisi_pa_pmu_v3_attr_groups[] = { 377 400 &hisi_pa_pmu_v2_format_group, 378 401 &hisi_pa_pmu_v3_events_group, 379 - &hisi_pa_pmu_cpumask_attr_group, 380 - &hisi_pa_pmu_identifier_group, 402 + &hisi_pmu_cpumask_attr_group, 403 + &hisi_pmu_identifier_group, 381 404 NULL 382 405 }; 383 406 ··· 396 419 static const struct attribute_group *hisi_h60pa_pmu_attr_groups[] = { 397 420 &hisi_pa_pmu_v2_format_group, 398 421 &hisi_h60pa_pmu_events_group, 399 - &hisi_pa_pmu_cpumask_attr_group, 400 - &hisi_pa_pmu_identifier_group, 422 + &hisi_pmu_cpumask_attr_group, 423 + &hisi_pmu_identifier_group, 401 424 NULL 402 425 }; 403 426
+35 -10
drivers/perf/hisilicon/hisi_uncore_pmu.c
··· 49 49 } 50 50 EXPORT_SYMBOL_NS_GPL(hisi_cpumask_sysfs_show, "HISI_PMU"); 51 51 52 + static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 53 + 54 + static struct attribute *hisi_pmu_cpumask_attrs[] = { 55 + &dev_attr_cpumask.attr, 56 + NULL 57 + }; 58 + 59 + const struct attribute_group hisi_pmu_cpumask_attr_group = { 60 + .attrs = hisi_pmu_cpumask_attrs, 61 + }; 62 + EXPORT_SYMBOL_NS_GPL(hisi_pmu_cpumask_attr_group, "HISI_PMU"); 63 + 64 + ssize_t hisi_uncore_pmu_identifier_attr_show(struct device *dev, 65 + struct device_attribute *attr, 66 + char *page) 67 + { 68 + struct hisi_pmu *hisi_pmu = to_hisi_pmu(dev_get_drvdata(dev)); 69 + 70 + return sysfs_emit(page, "0x%08x\n", hisi_pmu->identifier); 71 + } 72 + EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_identifier_attr_show, "HISI_PMU"); 73 + 74 + static struct device_attribute hisi_pmu_identifier_attr = 75 + __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 76 + 77 + static struct attribute *hisi_pmu_identifier_attrs[] = { 78 + &hisi_pmu_identifier_attr.attr, 79 + NULL 80 + }; 81 + 82 + const struct attribute_group hisi_pmu_identifier_group = { 83 + .attrs = hisi_pmu_identifier_attrs, 84 + }; 85 + EXPORT_SYMBOL_NS_GPL(hisi_pmu_identifier_group, "HISI_PMU"); 86 + 52 87 static bool hisi_validate_event_group(struct perf_event *event) 53 88 { 54 89 struct perf_event *sibling, *leader = event->group_leader; ··· 133 98 return idx; 134 99 } 135 100 EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_get_event_idx, "HISI_PMU"); 136 - 137 - ssize_t hisi_uncore_pmu_identifier_attr_show(struct device *dev, 138 - struct device_attribute *attr, 139 - char *page) 140 - { 141 - struct hisi_pmu *hisi_pmu = to_hisi_pmu(dev_get_drvdata(dev)); 142 - 143 - return sysfs_emit(page, "0x%08x\n", hisi_pmu->identifier); 144 - } 145 - EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_identifier_attr_show, "HISI_PMU"); 146 101 147 102 static void hisi_uncore_pmu_clear_event_idx(struct hisi_pmu *hisi_pmu, int idx) 148 103 {
+4
drivers/perf/hisilicon/hisi_uncore_pmu.h
··· 137 137 u32 identifier; 138 138 }; 139 139 140 + /* Generic implementation of cpumask/identifier group */ 141 + extern const struct attribute_group hisi_pmu_cpumask_attr_group; 142 + extern const struct attribute_group hisi_pmu_identifier_group; 143 + 140 144 int hisi_uncore_pmu_get_event_idx(struct perf_event *event); 141 145 void hisi_uncore_pmu_read(struct perf_event *event); 142 146 int hisi_uncore_pmu_add(struct perf_event *event, int flags);
+2 -25
drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c
··· 344 344 .attrs = hisi_sllc_pmu_v2_events_attr, 345 345 }; 346 346 347 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 348 - 349 - static struct attribute *hisi_sllc_pmu_cpumask_attrs[] = { 350 - &dev_attr_cpumask.attr, 351 - NULL 352 - }; 353 - 354 - static const struct attribute_group hisi_sllc_pmu_cpumask_attr_group = { 355 - .attrs = hisi_sllc_pmu_cpumask_attrs, 356 - }; 357 - 358 - static struct device_attribute hisi_sllc_pmu_identifier_attr = 359 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 360 - 361 - static struct attribute *hisi_sllc_pmu_identifier_attrs[] = { 362 - &hisi_sllc_pmu_identifier_attr.attr, 363 - NULL 364 - }; 365 - 366 - static const struct attribute_group hisi_sllc_pmu_identifier_group = { 367 - .attrs = hisi_sllc_pmu_identifier_attrs, 368 - }; 369 - 370 347 static const struct attribute_group *hisi_sllc_pmu_v2_attr_groups[] = { 371 348 &hisi_sllc_pmu_v2_format_group, 372 349 &hisi_sllc_pmu_v2_events_group, 373 - &hisi_sllc_pmu_cpumask_attr_group, 374 - &hisi_sllc_pmu_identifier_group, 350 + &hisi_pmu_cpumask_attr_group, 351 + &hisi_pmu_identifier_group, 375 352 NULL 376 353 }; 377 354
+2 -25
drivers/perf/hisilicon/hisi_uncore_uc_pmu.c
··· 437 437 .attrs = hisi_uc_pmu_events_attr, 438 438 }; 439 439 440 - static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL); 441 - 442 - static struct attribute *hisi_uc_pmu_cpumask_attrs[] = { 443 - &dev_attr_cpumask.attr, 444 - NULL, 445 - }; 446 - 447 - static const struct attribute_group hisi_uc_pmu_cpumask_attr_group = { 448 - .attrs = hisi_uc_pmu_cpumask_attrs, 449 - }; 450 - 451 - static struct device_attribute hisi_uc_pmu_identifier_attr = 452 - __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL); 453 - 454 - static struct attribute *hisi_uc_pmu_identifier_attrs[] = { 455 - &hisi_uc_pmu_identifier_attr.attr, 456 - NULL 457 - }; 458 - 459 - static const struct attribute_group hisi_uc_pmu_identifier_group = { 460 - .attrs = hisi_uc_pmu_identifier_attrs, 461 - }; 462 - 463 440 static const struct attribute_group *hisi_uc_pmu_attr_groups[] = { 464 441 &hisi_uc_pmu_format_group, 465 442 &hisi_uc_pmu_events_group, 466 - &hisi_uc_pmu_cpumask_attr_group, 467 - &hisi_uc_pmu_identifier_group, 443 + &hisi_pmu_cpumask_attr_group, 444 + &hisi_pmu_identifier_group, 468 445 NULL 469 446 }; 470 447