@@ -327,11 +327,10 @@ static void m1_pmu_disable_counter_interrupt(unsigned int index)
327
327
__m1_pmu_enable_counter_interrupt (index , false);
328
328
}
329
329
330
- static void m1_pmu_configure_counter (unsigned int index , u8 event ,
331
- bool user , bool kernel )
330
+ static void __m1_pmu_configure_event_filter (unsigned int index , bool user ,
331
+ bool kernel )
332
332
{
333
- u64 val , user_bit , kernel_bit ;
334
- int shift ;
333
+ u64 clear , set , user_bit , kernel_bit ;
335
334
336
335
switch (index ) {
337
336
case 0 ... 7 :
@@ -346,19 +345,24 @@ static void m1_pmu_configure_counter(unsigned int index, u8 event,
346
345
BUG ();
347
346
}
348
347
349
- val = read_sysreg_s (SYS_IMP_APL_PMCR1_EL1 );
350
-
348
+ clear = set = 0 ;
351
349
if (user )
352
- val |= user_bit ;
350
+ set |= user_bit ;
353
351
else
354
- val &= ~ user_bit ;
352
+ clear |= user_bit ;
355
353
356
354
if (kernel )
357
- val |= kernel_bit ;
355
+ set |= kernel_bit ;
358
356
else
359
- val &= ~ kernel_bit ;
357
+ clear |= kernel_bit ;
360
358
361
- write_sysreg_s (val , SYS_IMP_APL_PMCR1_EL1 );
359
+ sysreg_clear_set_s (SYS_IMP_APL_PMCR1_EL1 , clear , set );
360
+ }
361
+
362
+ static void __m1_pmu_configure_eventsel (unsigned int index , u8 event )
363
+ {
364
+ u64 clear = 0 , set = 0 ;
365
+ int shift ;
362
366
363
367
/*
364
368
* Counters 0 and 1 have fixed events. For anything else,
@@ -371,21 +375,29 @@ static void m1_pmu_configure_counter(unsigned int index, u8 event,
371
375
break ;
372
376
case 2 ... 5 :
373
377
shift = (index - 2 ) * 8 ;
374
- val = read_sysreg_s (SYS_IMP_APL_PMESR0_EL1 );
375
- val &= ~((u64 )0xff << shift );
376
- val |= (u64 )event << shift ;
377
- write_sysreg_s (val , SYS_IMP_APL_PMESR0_EL1 );
378
+ clear |= (u64 )0xff << shift ;
379
+ set |= (u64 )event << shift ;
380
+ sysreg_clear_set_s (SYS_IMP_APL_PMESR0_EL1 , clear , set );
378
381
break ;
379
382
case 6 ... 9 :
380
383
shift = (index - 6 ) * 8 ;
381
- val = read_sysreg_s (SYS_IMP_APL_PMESR1_EL1 );
382
- val &= ~((u64 )0xff << shift );
383
- val |= (u64 )event << shift ;
384
- write_sysreg_s (val , SYS_IMP_APL_PMESR1_EL1 );
384
+ clear |= (u64 )0xff << shift ;
385
+ set |= (u64 )event << shift ;
386
+ sysreg_clear_set_s (SYS_IMP_APL_PMESR1_EL1 , clear , set );
385
387
break ;
386
388
}
387
389
}
388
390
391
+ static void m1_pmu_configure_counter (unsigned int index , unsigned long config_base )
392
+ {
393
+ bool kernel = config_base & M1_PMU_CFG_COUNT_KERNEL ;
394
+ bool user = config_base & M1_PMU_CFG_COUNT_USER ;
395
+ u8 evt = config_base & M1_PMU_CFG_EVENT ;
396
+
397
+ __m1_pmu_configure_event_filter (index , user , kernel );
398
+ __m1_pmu_configure_eventsel (index , evt );
399
+ }
400
+
389
401
/* arm_pmu backend */
390
402
static void m1_pmu_enable_event (struct perf_event * event )
391
403
{
@@ -400,7 +412,7 @@ static void m1_pmu_enable_event(struct perf_event *event)
400
412
m1_pmu_disable_counter (event -> hw .idx );
401
413
isb ();
402
414
403
- m1_pmu_configure_counter (event -> hw .idx , evt , user , kernel );
415
+ m1_pmu_configure_counter (event -> hw .idx , event -> hw . config_base );
404
416
m1_pmu_enable_counter (event -> hw .idx );
405
417
m1_pmu_enable_counter_interrupt (event -> hw .idx );
406
418
isb ();
0 commit comments