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

selftests/powerpc/pmu: Add selftest for blacklist events check in power9

Some of the events are blacklisted in power9. The list of blacklisted
events are noted in power9-events-list.h When trying to do event open
for any of these blacklisted event will cause a failure. Testcase
ensures that using blacklisted events will cause event_open to fail in
power9. This test is only applicable on power9 DD2.1 and DD2.2 and hence
test adds checks to skip on other platforms.

Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220610134113.62991-26-atrajeev@linux.vnet.ibm.com

authored by

Athira Rajeev and committed by
Michael Ellerman
a77c6976 0c902633

+134 -1
+2 -1
tools/testing/selftests/powerpc/pmu/event_code_tests/Makefile
··· 3 3 4 4 TEST_GEN_PROGS := group_constraint_pmc56_test group_pmc56_exclude_constraints_test group_constraint_pmc_count_test \ 5 5 group_constraint_repeat_test group_constraint_radix_scope_qual_test reserved_bits_mmcra_sample_elig_mode_test \ 6 - group_constraint_mmcra_sample_test invalid_event_code_test reserved_bits_mmcra_thresh_ctl_test 6 + group_constraint_mmcra_sample_test invalid_event_code_test reserved_bits_mmcra_thresh_ctl_test \ 7 + blacklisted_events_test 7 8 8 9 top_srcdir = ../../../../../.. 9 10 include ../../../lib.mk
+132
tools/testing/selftests/powerpc/pmu/event_code_tests/blacklisted_events_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright 2022, Athira Rajeev, IBM Corp. 4 + */ 5 + 6 + #include <stdio.h> 7 + #include <sys/prctl.h> 8 + #include <limits.h> 9 + #include "../event.h" 10 + #include "../sampling_tests/misc.h" 11 + 12 + #define PM_DTLB_MISS_16G 0x1c058 13 + #define PM_DERAT_MISS_2M 0x1c05a 14 + #define PM_DTLB_MISS_2M 0x1c05c 15 + #define PM_MRK_DTLB_MISS_1G 0x1d15c 16 + #define PM_DTLB_MISS_4K 0x2c056 17 + #define PM_DERAT_MISS_1G 0x2c05a 18 + #define PM_MRK_DERAT_MISS_2M 0x2d152 19 + #define PM_MRK_DTLB_MISS_4K 0x2d156 20 + #define PM_MRK_DTLB_MISS_16G 0x2d15e 21 + #define PM_DTLB_MISS_64K 0x3c056 22 + #define PM_MRK_DERAT_MISS_1G 0x3d152 23 + #define PM_MRK_DTLB_MISS_64K 0x3d156 24 + #define PM_DISP_HELD_SYNC_HOLD 0x4003c 25 + #define PM_DTLB_MISS_16M 0x4c056 26 + #define PM_DTLB_MISS_1G 0x4c05a 27 + #define PM_MRK_DTLB_MISS_16M 0x4c15e 28 + #define PM_MRK_ST_DONE_L2 0x10134 29 + #define PM_RADIX_PWC_L1_HIT 0x1f056 30 + #define PM_FLOP_CMPL 0x100f4 31 + #define PM_MRK_NTF_FIN 0x20112 32 + #define PM_RADIX_PWC_L2_HIT 0x2d024 33 + #define PM_IFETCH_THROTTLE 0x3405e 34 + #define PM_MRK_L2_TM_ST_ABORT_SISTER 0x3e15c 35 + #define PM_RADIX_PWC_L3_HIT 0x3f056 36 + #define PM_RUN_CYC_SMT2_MODE 0x3006c 37 + #define PM_TM_TX_PASS_RUN_INST 0x4e014 38 + 39 + #define PVR_POWER9_CUMULUS 0x00002000 40 + 41 + int blacklist_events_dd21[] = { 42 + PM_MRK_ST_DONE_L2, 43 + PM_RADIX_PWC_L1_HIT, 44 + PM_FLOP_CMPL, 45 + PM_MRK_NTF_FIN, 46 + PM_RADIX_PWC_L2_HIT, 47 + PM_IFETCH_THROTTLE, 48 + PM_MRK_L2_TM_ST_ABORT_SISTER, 49 + PM_RADIX_PWC_L3_HIT, 50 + PM_RUN_CYC_SMT2_MODE, 51 + PM_TM_TX_PASS_RUN_INST, 52 + PM_DISP_HELD_SYNC_HOLD, 53 + }; 54 + 55 + int blacklist_events_dd22[] = { 56 + PM_DTLB_MISS_16G, 57 + PM_DERAT_MISS_2M, 58 + PM_DTLB_MISS_2M, 59 + PM_MRK_DTLB_MISS_1G, 60 + PM_DTLB_MISS_4K, 61 + PM_DERAT_MISS_1G, 62 + PM_MRK_DERAT_MISS_2M, 63 + PM_MRK_DTLB_MISS_4K, 64 + PM_MRK_DTLB_MISS_16G, 65 + PM_DTLB_MISS_64K, 66 + PM_MRK_DERAT_MISS_1G, 67 + PM_MRK_DTLB_MISS_64K, 68 + PM_DISP_HELD_SYNC_HOLD, 69 + PM_DTLB_MISS_16M, 70 + PM_DTLB_MISS_1G, 71 + PM_MRK_DTLB_MISS_16M, 72 + }; 73 + 74 + int pvr_min; 75 + 76 + /* 77 + * check for power9 support for 2.1 and 78 + * 2.2 model where blacklist is applicable. 79 + */ 80 + int check_for_power9_version(void) 81 + { 82 + pvr_min = PVR_MIN(mfspr(SPRN_PVR)); 83 + 84 + SKIP_IF(PVR_VER(pvr) != POWER9); 85 + SKIP_IF(!(pvr & PVR_POWER9_CUMULUS)); 86 + 87 + SKIP_IF(!(3 - pvr_min)); 88 + 89 + return 0; 90 + } 91 + 92 + /* 93 + * Testcase to ensure that using blacklisted bits in 94 + * event code should cause event_open to fail in power9 95 + */ 96 + 97 + static int blacklisted_events(void) 98 + { 99 + struct event event; 100 + int i = 0; 101 + 102 + /* Check for platform support for the test */ 103 + SKIP_IF(platform_check_for_tests()); 104 + 105 + /* 106 + * check for power9 support for 2.1 and 107 + * 2.2 model where blacklist is applicable. 108 + */ 109 + SKIP_IF(check_for_power9_version()); 110 + 111 + /* Skip for Generic compat mode */ 112 + SKIP_IF(check_for_generic_compat_pmu()); 113 + 114 + if (pvr_min == 1) { 115 + for (i = 0; i < ARRAY_SIZE(blacklist_events_dd21); i++) { 116 + event_init(&event, blacklist_events_dd21[i]); 117 + FAIL_IF(!event_open(&event)); 118 + } 119 + } else if (pvr_min == 2) { 120 + for (i = 0; i < ARRAY_SIZE(blacklist_events_dd22); i++) { 121 + event_init(&event, blacklist_events_dd22[i]); 122 + FAIL_IF(!event_open(&event)); 123 + } 124 + } 125 + 126 + return 0; 127 + } 128 + 129 + int main(void) 130 + { 131 + return test_harness(blacklisted_events, "blacklisted_events"); 132 + }