-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/powerpc/pmu: Add selftest for group constraint check for MM…
…CRA thresh_cmp field Thresh compare bits for a event is used to program thresh compare field in Monitor Mode Control Register A (MMCRA: 9-18 bits for power9 and MMCRA: 8-18 bits for power10). When scheduling events as a group, all events in that group should match value in thresh compare bits. Otherwise event open for the sibling events will fail. Testcase uses event code "0x401e0" as leader and another event "0x101ec" as sibling event, and checks for thresh compare constraint via perf interface. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220610134113.62991-32-atrajeev@linux.vnet.ibm.com
- Loading branch information
Kajol Jain
authored and
Michael Ellerman
committed
Jun 28, 2022
1 parent
291c01e
commit 8eaca8c
Showing
2 changed files
with
97 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
96 changes: 96 additions & 0 deletions
96
tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_thresh_cmp_test.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Copyright 2022, Kajol Jain, IBM Corp. | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
|
||
#include "../event.h" | ||
#include "utils.h" | ||
#include "../sampling_tests/misc.h" | ||
|
||
/* | ||
* Primary PMU events used here is PM_MRK_INST_CMPL (0x401e0) and | ||
* PM_THRESH_MET (0x101ec) | ||
* Threshold event selection used is issue to complete for cycles | ||
* Sampling criteria is Load or Store only sampling | ||
*/ | ||
#define p9_EventCode_1 0x13e35340401e0 | ||
#define p9_EventCode_2 0x17d34340101ec | ||
#define p9_EventCode_3 0x13e35340101ec | ||
#define p10_EventCode_1 0x35340401e0 | ||
#define p10_EventCode_2 0x35340101ec | ||
|
||
/* | ||
* Testcase for group constraint check of thresh_cmp bits which is | ||
* used to program thresh compare field in Monitor Mode Control Register A | ||
* (MMCRA: 9-18 bits for power9 and MMCRA: 8-18 bits for power10). | ||
* All events in the group should match thresh compare bits otherwise | ||
* event_open for the group will fail. | ||
*/ | ||
static int group_constraint_thresh_cmp(void) | ||
{ | ||
struct event event, leader; | ||
|
||
/* Check for platform support for the test */ | ||
SKIP_IF(platform_check_for_tests()); | ||
|
||
if (have_hwcap2(PPC_FEATURE2_ARCH_3_1)) { | ||
/* Init the events for the group contraint check for thresh_cmp bits */ | ||
event_init(&leader, p10_EventCode_1); | ||
|
||
/* Add the thresh_cmp value for leader in config1 */ | ||
leader.attr.config1 = 1000; | ||
FAIL_IF(event_open(&leader)); | ||
|
||
event_init(&event, p10_EventCode_2); | ||
|
||
/* Add the different thresh_cmp value from the leader event in config1 */ | ||
event.attr.config1 = 2000; | ||
|
||
/* Expected to fail as sibling and leader event request different thresh_cmp bits */ | ||
FAIL_IF(!event_open_with_group(&event, leader.fd)); | ||
|
||
event_close(&event); | ||
|
||
/* Init the event for the group contraint thresh compare test */ | ||
event_init(&event, p10_EventCode_2); | ||
|
||
/* Add the same thresh_cmp value for leader and sibling event in config1 */ | ||
event.attr.config1 = 1000; | ||
|
||
/* Expected to succeed as sibling and leader event request same thresh_cmp bits */ | ||
FAIL_IF(event_open_with_group(&event, leader.fd)); | ||
|
||
event_close(&leader); | ||
event_close(&event); | ||
} else { | ||
/* Init the events for the group contraint check for thresh_cmp bits */ | ||
event_init(&leader, p9_EventCode_1); | ||
FAIL_IF(event_open(&leader)); | ||
|
||
event_init(&event, p9_EventCode_2); | ||
|
||
/* Expected to fail as sibling and leader event request different thresh_cmp bits */ | ||
FAIL_IF(!event_open_with_group(&event, leader.fd)); | ||
|
||
event_close(&event); | ||
|
||
/* Init the event for the group contraint thresh compare test */ | ||
event_init(&event, p9_EventCode_3); | ||
|
||
/* Expected to succeed as sibling and leader event request same thresh_cmp bits */ | ||
FAIL_IF(event_open_with_group(&event, leader.fd)); | ||
|
||
event_close(&leader); | ||
event_close(&event); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int main(void) | ||
{ | ||
return test_harness(group_constraint_thresh_cmp, "group_constraint_thresh_cmp"); | ||
} |