174
174
#define CMN_CONFIG_WP_COMBINE GENMASK_ULL(30, 27)
175
175
#define CMN_CONFIG_WP_DEV_SEL GENMASK_ULL(50, 48)
176
176
#define CMN_CONFIG_WP_CHN_SEL GENMASK_ULL(55, 51)
177
- /* Note that we don't yet support the tertiary match group on newer IPs */
178
- #define CMN_CONFIG_WP_GRP BIT_ULL(56)
179
- #define CMN_CONFIG_WP_EXCLUSIVE BIT_ULL(57)
177
+ #define CMN_CONFIG_WP_GRP GENMASK_ULL(57, 56)
178
+ #define CMN_CONFIG_WP_EXCLUSIVE BIT_ULL(58)
180
179
#define CMN_CONFIG1_WP_VAL GENMASK_ULL(63, 0)
181
180
#define CMN_CONFIG2_WP_MASK GENMASK_ULL(63, 0)
182
181
@@ -1384,7 +1383,7 @@ static void arm_cmn_claim_wp_idx(struct arm_cmn_dtm *dtm,
1384
1383
arm_cmn_set_wp_idx (hw -> wp_idx , pos , wp_idx - CMN_EVENT_EVENTID (event ));
1385
1384
}
1386
1385
1387
- static u32 arm_cmn_wp_config (struct perf_event * event )
1386
+ static u32 arm_cmn_wp_config (struct perf_event * event , int wp_idx )
1388
1387
{
1389
1388
u32 config ;
1390
1389
u32 dev = CMN_EVENT_WP_DEV_SEL (event );
@@ -1394,14 +1393,20 @@ static u32 arm_cmn_wp_config(struct perf_event *event)
1394
1393
u32 combine = CMN_EVENT_WP_COMBINE (event );
1395
1394
bool is_cmn600 = to_cmn (event -> pmu )-> part == PART_CMN600 ;
1396
1395
1396
+ /* CMN-600 supports only primary and secondary matching groups */
1397
+ if (is_cmn600 )
1398
+ grp &= 1 ;
1399
+
1397
1400
config = FIELD_PREP (CMN_DTM_WPn_CONFIG_WP_DEV_SEL , dev ) |
1398
1401
FIELD_PREP (CMN_DTM_WPn_CONFIG_WP_CHN_SEL , chn ) |
1399
1402
FIELD_PREP (CMN_DTM_WPn_CONFIG_WP_GRP , grp ) |
1400
1403
FIELD_PREP (CMN_DTM_WPn_CONFIG_WP_DEV_SEL2 , dev >> 1 );
1401
1404
if (exc )
1402
1405
config |= is_cmn600 ? CMN600_WPn_CONFIG_WP_EXCLUSIVE :
1403
1406
CMN_DTM_WPn_CONFIG_WP_EXCLUSIVE ;
1404
- if (combine && !grp )
1407
+
1408
+ /* wp_combine is available only on WP0 and WP2 */
1409
+ if (combine && !(wp_idx & 0x1 ))
1405
1410
config |= is_cmn600 ? CMN600_WPn_CONFIG_WP_COMBINE :
1406
1411
CMN_DTM_WPn_CONFIG_WP_COMBINE ;
1407
1412
return config ;
@@ -1898,12 +1903,14 @@ static int arm_cmn_event_add(struct perf_event *event, int flags)
1898
1903
input_sel = CMN__PMEVCNT0_INPUT_SEL_XP + dtm_idx ;
1899
1904
} else if (type == CMN_TYPE_WP ) {
1900
1905
int tmp , wp_idx ;
1901
- u32 cfg = arm_cmn_wp_config ( event ) ;
1906
+ u32 cfg ;
1902
1907
1903
1908
wp_idx = arm_cmn_find_free_wp_idx (dtm , event );
1904
1909
if (wp_idx < 0 )
1905
1910
goto free_dtms ;
1906
1911
1912
+ cfg = arm_cmn_wp_config (event , wp_idx );
1913
+
1907
1914
tmp = dtm -> wp_event [wp_idx ^ 1 ];
1908
1915
if (tmp >= 0 && CMN_EVENT_WP_COMBINE (event ) !=
1909
1916
CMN_EVENT_WP_COMBINE (cmn -> dtc [d ].counters [tmp ]))
0 commit comments