123
123
124
124
/* DTC counters are paired in 64-bit registers on a 16-byte stride. Yuck */
125
125
#define _CMN_DT_CNT_REG (n ) ((((n) / 2) * 4 + (n) % 2) * 4)
126
- #define CMN_DT_PMEVCNT (n ) (CMN_PMU_OFFSET + _CMN_DT_CNT_REG(n))
127
- #define CMN_DT_PMCCNTR (CMN_PMU_OFFSET + 0x40)
126
+ #define CMN_DT_PMEVCNT (dtc , n ) ((dtc)->pmu_base + _CMN_DT_CNT_REG(n))
127
+ #define CMN_DT_PMCCNTR ( dtc ) ((dtc)->pmu_base + 0x40)
128
128
129
- #define CMN_DT_PMEVCNTSR (n ) (CMN_PMU_OFFSET + 0x50 + _CMN_DT_CNT_REG(n))
130
- #define CMN_DT_PMCCNTRSR (CMN_PMU_OFFSET + 0x90)
129
+ #define CMN_DT_PMEVCNTSR (dtc , n ) ((dtc)->pmu_base + 0x50 + _CMN_DT_CNT_REG(n))
130
+ #define CMN_DT_PMCCNTRSR ( dtc ) ((dtc)->pmu_base + 0x90)
131
131
132
- #define CMN_DT_PMCR (CMN_PMU_OFFSET + 0x100)
132
+ #define CMN_DT_PMCR ( dtc ) ((dtc)->pmu_base + 0x100)
133
133
#define CMN_DT_PMCR_PMU_EN BIT(0)
134
134
#define CMN_DT_PMCR_CNTR_RST BIT(5)
135
135
#define CMN_DT_PMCR_OVFL_INTR_EN BIT(6)
136
136
137
- #define CMN_DT_PMOVSR (CMN_PMU_OFFSET + 0x118)
138
- #define CMN_DT_PMOVSR_CLR (CMN_PMU_OFFSET + 0x120)
137
+ #define CMN_DT_PMOVSR ( dtc ) ((dtc)->pmu_base + 0x118)
138
+ #define CMN_DT_PMOVSR_CLR ( dtc ) ((dtc)->pmu_base + 0x120)
139
139
140
- #define CMN_DT_PMSSR (CMN_PMU_OFFSET + 0x128)
140
+ #define CMN_DT_PMSSR ( dtc ) ((dtc)->pmu_base + 0x128)
141
141
#define CMN_DT_PMSSR_SS_STATUS (n ) BIT(n)
142
142
143
- #define CMN_DT_PMSRR (CMN_PMU_OFFSET + 0x130)
143
+ #define CMN_DT_PMSRR ( dtc ) ((dtc)->pmu_base + 0x130)
144
144
#define CMN_DT_PMSRR_SS_REQ BIT(0)
145
145
146
146
#define CMN_DT_NUM_COUNTERS 8
@@ -307,8 +307,9 @@ struct arm_cmn_dtm {
307
307
308
308
struct arm_cmn_dtc {
309
309
void __iomem * base ;
310
+ void __iomem * pmu_base ;
310
311
int irq ;
311
- int irq_friend ;
312
+ s8 irq_friend ;
312
313
bool cc_active ;
313
314
314
315
struct perf_event * counters [CMN_DT_NUM_COUNTERS ];
@@ -412,10 +413,15 @@ static enum cmn_model arm_cmn_model(const struct arm_cmn *cmn)
412
413
};
413
414
}
414
415
416
+ static int arm_cmn_pmu_offset (const struct arm_cmn * cmn , const struct arm_cmn_node * dn )
417
+ {
418
+ return CMN_PMU_OFFSET ;
419
+ }
420
+
415
421
static u32 arm_cmn_device_connect_info (const struct arm_cmn * cmn ,
416
422
const struct arm_cmn_node * xp , int port )
417
423
{
418
- int offset = CMN_MXP__CONNECT_INFO (port );
424
+ int offset = CMN_MXP__CONNECT_INFO (port ) - arm_cmn_pmu_offset ( cmn , xp ) ;
419
425
420
426
if (port >= 2 ) {
421
427
if (cmn -> part == PART_CMN600 || cmn -> part == PART_CMN650 )
@@ -428,7 +434,7 @@ static u32 arm_cmn_device_connect_info(const struct arm_cmn *cmn,
428
434
offset += CI700_CONNECT_INFO_P2_5_OFFSET ;
429
435
}
430
436
431
- return readl_relaxed (xp -> pmu_base - CMN_PMU_OFFSET + offset );
437
+ return readl_relaxed (xp -> pmu_base + offset );
432
438
}
433
439
434
440
static struct dentry * arm_cmn_debugfs ;
@@ -1398,7 +1404,7 @@ static u32 arm_cmn_wp_config(struct perf_event *event, int wp_idx)
1398
1404
static void arm_cmn_set_state (struct arm_cmn * cmn , u32 state )
1399
1405
{
1400
1406
if (!cmn -> state )
1401
- writel_relaxed (0 , cmn -> dtc [0 ]. base + CMN_DT_PMCR );
1407
+ writel_relaxed (0 , CMN_DT_PMCR ( & cmn -> dtc [0 ]) );
1402
1408
cmn -> state |= state ;
1403
1409
}
1404
1410
@@ -1407,7 +1413,7 @@ static void arm_cmn_clear_state(struct arm_cmn *cmn, u32 state)
1407
1413
cmn -> state &= ~state ;
1408
1414
if (!cmn -> state )
1409
1415
writel_relaxed (CMN_DT_PMCR_PMU_EN | CMN_DT_PMCR_OVFL_INTR_EN ,
1410
- cmn -> dtc [0 ]. base + CMN_DT_PMCR );
1416
+ CMN_DT_PMCR ( & cmn -> dtc [0 ]) );
1411
1417
}
1412
1418
1413
1419
static void arm_cmn_pmu_enable (struct pmu * pmu )
@@ -1442,18 +1448,19 @@ static u64 arm_cmn_read_dtm(struct arm_cmn *cmn, struct arm_cmn_hw_event *hw,
1442
1448
1443
1449
static u64 arm_cmn_read_cc (struct arm_cmn_dtc * dtc )
1444
1450
{
1445
- u64 val = readq_relaxed (dtc -> base + CMN_DT_PMCCNTR );
1451
+ void __iomem * pmccntr = CMN_DT_PMCCNTR (dtc );
1452
+ u64 val = readq_relaxed (pmccntr );
1446
1453
1447
- writeq_relaxed (CMN_CC_INIT , dtc -> base + CMN_DT_PMCCNTR );
1454
+ writeq_relaxed (CMN_CC_INIT , pmccntr );
1448
1455
return (val - CMN_CC_INIT ) & ((CMN_CC_INIT << 1 ) - 1 );
1449
1456
}
1450
1457
1451
1458
static u32 arm_cmn_read_counter (struct arm_cmn_dtc * dtc , int idx )
1452
1459
{
1453
- u32 val , pmevcnt = CMN_DT_PMEVCNT (idx );
1460
+ void __iomem * pmevcnt = CMN_DT_PMEVCNT (dtc , idx );
1461
+ u32 val = readl_relaxed (pmevcnt );
1454
1462
1455
- val = readl_relaxed (dtc -> base + pmevcnt );
1456
- writel_relaxed (CMN_COUNTER_INIT , dtc -> base + pmevcnt );
1463
+ writel_relaxed (CMN_COUNTER_INIT , pmevcnt );
1457
1464
return val - CMN_COUNTER_INIT ;
1458
1465
}
1459
1466
@@ -1464,7 +1471,7 @@ static void arm_cmn_init_counter(struct perf_event *event)
1464
1471
u64 count ;
1465
1472
1466
1473
for_each_hw_dtc_idx (hw , i , idx ) {
1467
- writel_relaxed (CMN_COUNTER_INIT , cmn -> dtc [i ]. base + CMN_DT_PMEVCNT ( idx ));
1474
+ writel_relaxed (CMN_COUNTER_INIT , CMN_DT_PMEVCNT ( & cmn -> dtc [i ], idx ));
1468
1475
cmn -> dtc [i ].counters [idx ] = event ;
1469
1476
}
1470
1477
@@ -1551,7 +1558,7 @@ static void arm_cmn_event_start(struct perf_event *event, int flags)
1551
1558
1552
1559
writel_relaxed (CMN_DT_DTC_CTL_DT_EN | CMN_DT_DTC_CTL_CG_DISABLE ,
1553
1560
dtc -> base + CMN_DT_DTC_CTL );
1554
- writeq_relaxed (CMN_CC_INIT , dtc -> base + CMN_DT_PMCCNTR );
1561
+ writeq_relaxed (CMN_CC_INIT , CMN_DT_PMCCNTR ( dtc ) );
1555
1562
dtc -> cc_active = true;
1556
1563
} else if (type == CMN_TYPE_WP ) {
1557
1564
u64 val = CMN_EVENT_WP_VAL (event );
@@ -2028,7 +2035,7 @@ static irqreturn_t arm_cmn_handle_irq(int irq, void *dev_id)
2028
2035
irqreturn_t ret = IRQ_NONE ;
2029
2036
2030
2037
for (;;) {
2031
- u32 status = readl_relaxed (dtc -> base + CMN_DT_PMOVSR );
2038
+ u32 status = readl_relaxed (CMN_DT_PMOVSR ( dtc ) );
2032
2039
u64 delta ;
2033
2040
int i ;
2034
2041
@@ -2050,7 +2057,7 @@ static irqreturn_t arm_cmn_handle_irq(int irq, void *dev_id)
2050
2057
}
2051
2058
}
2052
2059
2053
- writel_relaxed (status , dtc -> base + CMN_DT_PMOVSR_CLR );
2060
+ writel_relaxed (status , CMN_DT_PMOVSR_CLR ( dtc ) );
2054
2061
2055
2062
if (!dtc -> irq_friend )
2056
2063
return ret ;
@@ -2104,15 +2111,16 @@ static int arm_cmn_init_dtc(struct arm_cmn *cmn, struct arm_cmn_node *dn, int id
2104
2111
{
2105
2112
struct arm_cmn_dtc * dtc = cmn -> dtc + idx ;
2106
2113
2107
- dtc -> base = dn -> pmu_base - CMN_PMU_OFFSET ;
2114
+ dtc -> pmu_base = dn -> pmu_base ;
2115
+ dtc -> base = dtc -> pmu_base - arm_cmn_pmu_offset (cmn , dn );
2108
2116
dtc -> irq = platform_get_irq (to_platform_device (cmn -> dev ), idx );
2109
2117
if (dtc -> irq < 0 )
2110
2118
return dtc -> irq ;
2111
2119
2112
2120
writel_relaxed (CMN_DT_DTC_CTL_DT_EN , dtc -> base + CMN_DT_DTC_CTL );
2113
- writel_relaxed (CMN_DT_PMCR_PMU_EN | CMN_DT_PMCR_OVFL_INTR_EN , dtc -> base + CMN_DT_PMCR );
2114
- writeq_relaxed (0 , dtc -> base + CMN_DT_PMCCNTR );
2115
- writel_relaxed (0x1ff , dtc -> base + CMN_DT_PMOVSR_CLR );
2121
+ writel_relaxed (CMN_DT_PMCR_PMU_EN | CMN_DT_PMCR_OVFL_INTR_EN , CMN_DT_PMCR ( dtc ) );
2122
+ writeq_relaxed (0 , CMN_DT_PMCCNTR ( dtc ) );
2123
+ writel_relaxed (0x1ff , CMN_DT_PMOVSR_CLR ( dtc ) );
2116
2124
2117
2125
return 0 ;
2118
2126
}
@@ -2200,7 +2208,7 @@ static void arm_cmn_init_node_info(struct arm_cmn *cmn, u32 offset, struct arm_c
2200
2208
node -> id = FIELD_GET (CMN_NI_NODE_ID , reg );
2201
2209
node -> logid = FIELD_GET (CMN_NI_LOGICAL_ID , reg );
2202
2210
2203
- node -> pmu_base = cmn -> base + offset + CMN_PMU_OFFSET ;
2211
+ node -> pmu_base = cmn -> base + offset + arm_cmn_pmu_offset ( cmn , node ) ;
2204
2212
2205
2213
if (node -> type == CMN_TYPE_CFG )
2206
2214
level = 0 ;
0 commit comments