aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/bus/arm-ccn.c')
-rw-r--r--drivers/bus/arm-ccn.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c
index 27fd0dacad5f..4d523cfe51ce 100644
--- a/drivers/bus/arm-ccn.c
+++ b/drivers/bus/arm-ccn.c
@@ -183,6 +183,7 @@ struct arm_ccn {
183 struct arm_ccn_component *xp; 183 struct arm_ccn_component *xp;
184 184
185 struct arm_ccn_dt dt; 185 struct arm_ccn_dt dt;
186 int mn_id;
186}; 187};
187 188
188 189
@@ -322,6 +323,7 @@ struct arm_ccn_pmu_event {
322static ssize_t arm_ccn_pmu_event_show(struct device *dev, 323static ssize_t arm_ccn_pmu_event_show(struct device *dev,
323 struct device_attribute *attr, char *buf) 324 struct device_attribute *attr, char *buf)
324{ 325{
326 struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
325 struct arm_ccn_pmu_event *event = container_of(attr, 327 struct arm_ccn_pmu_event *event = container_of(attr,
326 struct arm_ccn_pmu_event, attr); 328 struct arm_ccn_pmu_event, attr);
327 ssize_t res; 329 ssize_t res;
@@ -336,6 +338,26 @@ static ssize_t arm_ccn_pmu_event_show(struct device *dev,
336 if (event->mask) 338 if (event->mask)
337 res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x", 339 res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x",
338 event->mask); 340 event->mask);
341
342 /* Arguments required by an event */
343 switch (event->type) {
344 case CCN_TYPE_CYCLES:
345 break;
346 case CCN_TYPE_XP:
347 res += snprintf(buf + res, PAGE_SIZE - res,
348 ",xp=?,port=?,vc=?,dir=?");
349 if (event->event == CCN_EVENT_WATCHPOINT)
350 res += snprintf(buf + res, PAGE_SIZE - res,
351 ",cmp_l=?,cmp_h=?,mask=?");
352 break;
353 case CCN_TYPE_MN:
354 res += snprintf(buf + res, PAGE_SIZE - res, ",node=%d", ccn->mn_id);
355 break;
356 default:
357 res += snprintf(buf + res, PAGE_SIZE - res, ",node=?");
358 break;
359 }
360
339 res += snprintf(buf + res, PAGE_SIZE - res, "\n"); 361 res += snprintf(buf + res, PAGE_SIZE - res, "\n");
340 362
341 return res; 363 return res;
@@ -360,9 +382,9 @@ static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj,
360} 382}
361 383
362static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { 384static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = {
363 CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), 385 CCN_EVENT_MN(eobarrier, "dir=1,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE),
364 CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), 386 CCN_EVENT_MN(ecbarrier, "dir=1,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE),
365 CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), 387 CCN_EVENT_MN(dvmop, "dir=1,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE),
366 CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), 388 CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY),
367 CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), 389 CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY),
368 CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), 390 CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY),
@@ -649,6 +671,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
649 671
650 /* Validate node/xp vs topology */ 672 /* Validate node/xp vs topology */
651 switch (type) { 673 switch (type) {
674 case CCN_TYPE_MN:
675 if (node_xp != ccn->mn_id) {
676 dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp);
677 return -EINVAL;
678 }
679 break;
652 case CCN_TYPE_XP: 680 case CCN_TYPE_XP:
653 if (node_xp >= ccn->num_xps) { 681 if (node_xp >= ccn->num_xps) {
654 dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); 682 dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp);
@@ -1214,6 +1242,8 @@ static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region,
1214 1242
1215 switch (type) { 1243 switch (type) {
1216 case CCN_TYPE_MN: 1244 case CCN_TYPE_MN:
1245 ccn->mn_id = id;
1246 return 0;
1217 case CCN_TYPE_DT: 1247 case CCN_TYPE_DT:
1218 return 0; 1248 return 0;
1219 case CCN_TYPE_XP: 1249 case CCN_TYPE_XP: